richedit sapi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

richedit sapi

Mesaj gönderen sr1111 »

asagidaki kodumda program okudugu kelimeleri seciyor.
fakat soyle bir sorun var.
1 alt satira gecince kelimenin bir ileri karakterine gecerek seciyor.
2 alt satira gecince kelimenin iki ileri karakterini gecerek seciyor. bu sekilde devam ediyor.
herlade #13#10 satır sonlarından sonra yapıyor.
bunu nasil bir döngü ile veya nasıl düzeltirim.


procedure TfrmTextToSpeech.SpVoiceWord(Sender: TObject;
StreamNumber: Integer; StreamPosition: OleVariant; CharacterPosition,
Length: Integer);
begin
reText.SetFocus;
reText.SelStart := CharacterPosition;
reText.SelLength := Length;
end;
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: richedit sapi

Mesaj gönderen sr1111 »

bir fikri olan veya yardımcı olacak yok mu
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: richedit sapi

Mesaj gönderen ikra »

Verdigin kod blogu problemin cözümü icin yeterli mi sence?
Benim tahminim; characterposition parametreni yanlis giriyorsun.
kıdemsiz üye
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: richedit sapi

Mesaj gönderen sr1111 »

yeterli bence. cunku sadece bu kod calistiriyor.
fakat dedigim gibi her satirda secilen kelimeyi bir karakter daha ilerisini seciyor.

characterposition unun her satirda -1 geri yapabilirsek belki cozulur.
satir 1 de characterposition -1
satir 2 de characterposition -2
satir 3 de characterposition -3 gibi bir döngüye soksak
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: richedit sapi

Mesaj gönderen ikra »

Peki.
kıdemsiz üye
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: richedit sapi

Mesaj gönderen ertank »

sr1111 yazdı: 13 Şub 2021 07:13 asagidaki kodumda program okudugu kelimeleri seciyor.
fakat soyle bir sorun var.
1 alt satira gecince kelimenin bir ileri karakterine gecerek seciyor.
2 alt satira gecince kelimenin iki ileri karakterini gecerek seciyor. bu sekilde devam ediyor.
herlade #13#10 satır sonlarından sonra yapıyor.
bunu nasil bir döngü ile veya nasıl düzeltirim.


procedure TfrmTextToSpeech.SpVoiceWord(Sender: TObject;
StreamNumber: Integer; StreamPosition: OleVariant; CharacterPosition,
Length: Integer);
begin
reText.SetFocus;
reText.SelStart := CharacterPosition;
reText.SelLength := Length;
end;
Merhaba,

Paylaştığınız kod sorunu kesin olarak anlamak için yeterli değil. Ancak sizin sorununuz kesinlikle paylaştığınız kod içindeki değişkenlerin değerleri kaynaklı. O hesaplamayı nerede yapıyor iseniz orayı kontrol etmeniz gerekli.

Tamamen tahmine dayalı olarak sorununuz şu:
ENTER metinlerde paragraf anlamına gelir. Metin uzun olduğunda yazmaya devam edildiğinde alt satırdan yazı devam edecektir. Burada alt satıra geçiş otomatik olur. Bu alt satır ekranda satır gibi gözükmesine rağmen halen aynı paragraf yazısı olacaktır. Bileşen ekranda gösterebilmek için yeni satıra geçmeyi otomatik ayarlayacaktır. Bileşenine göre satır sonlarına #10 (satır sonu, Line Feed) karakteri ekleyebilir veya eklemeyebilir. Bunu kullandığınız bileşen için kontrol etmelisiniz.

Dolayısıyla tahminime göre sizin kullandığınız bileşen ekrana sığdırma amaçlı alt satıra geçtiğinde üst satır sonuna #10 karakteri ekliyor. Siz CharacterPosition hesabınızda ise ekranda görülen her satırı yanlış şekilde bir paragraf gibi değerlendirerek #10#13 şeklinde iki karakter hesaplıyorsunuz.

Bu şekilde yapılan hesap yeni bir paragraf geçişine kadar her #10 ile biten satır için bir karakter fazladan hesap yapacaktır. Yani kelimeler paragrafın kaçıncı satırı ise hesap o kadar harf sapmalı oluyor.
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: richedit sapi

Mesaj gönderen sr1111 »

ertank, haklısınız fakat nasıl duzeltecegimi bilemiyorum.

spvoice1.Speak (reText.text, SVSFlagsAsync );

bu kodu okuyor. sonra

reText.SetFocus;
reText.SelStart := CharacterPosition;
reText.SelLength := Length;

buraya bir döngü kurmam lazım heralde.
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: richedit sapi

Mesaj gönderen sr1111 »

projeyi upload ettim bu linkte.
yapamadım.

https://disk.yandex.com.tr/d/k4R2Ie9hcBJ3Kw
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: richedit sapi

Mesaj gönderen ertank »

Bir ActiveX, OCX vb DLL dosyasını kullanarak TLB dosyası oluşturmuşsunuz ve bunu projenizde bileşen olarak kullanıyorsunuz. Bende ilgili bileşen olmadığı için proje açılır iken bileşen hataları alıyorum. Proje bende derlenmiyor.

Kodlardan incelediğim kadarıyla sizin uygulamanızda durum sorduğunuz ilk soruda detaylı ifade etmemiş olduğunuz için yanlış anlaşılıyor.

Siz kelime seçip sese çevirme algoritmasına göndermiyorsunuz. Algoritma kelime başlangıç konumunu ve uzunluğunu size gönderiyor.

Bu tespitten sonra için şu an için aklıma gelen tek yöntem, birinci karakterden başlayıp algoritma'dan gelen rakama ulaşana kadar algoritma misali istenmeyen karakterleri gözardı ederek karakter sayacaksınız. İki rakam olacak elinizde. Birincisi algoritma gibi kabul edilmeyen karakterlerin dahil olmadığı rakam. İkinci rakam ise birinci rakamın tüm karakterler dahil iz düşümü değeri olacak. Kullanıcıya ekranda doğru konumu gösterebilmek için bu ikinci rakam kullanılacak.

Delphi 10.3 ile derlenebilir, test *edilmemiş* aşağıdaki kodu başlangıç için kullanabilirsiniz. Ancak istenilen işi yapıp yapmadığından emin olmam maalesef mümkün değil.

Bu durumda, sizin ilk önce elinizdeki örnek metin verileri ile denemeler yaparak ilgili algoritmanın hangi karakterleri gözardı ettiğini tespit etmeniz gerekli.

Algoritma tarafından istenmeyen karakter tespit ettiğinizde örnek kod içindeki CharsToIgnore sabiti içine eklemeniz gerekli. Bunun dışında düzeltmeler de gerekebilir. Bunları sizin tespit edip düzeltmeniz gerekecek.

Fikir vermesi için kullanılabilecek kod:

Kod: Tümünü seç

const
  CharsToIgnore = [#10, #13];

function FindVisualPosition(const Text: string; const SpeechPosition: Integer): Integer;
var
  I: Integer;
  LSpeechPosition: Integer;
begin
  Result := 1;
  LSpeechPosition := 0;

  // I değişkeninin değeri #10, #13 gibi karakterler dahil edilerek hesaplanan posizyonu içeriyor
  for I := Low(Text) to High(Text) do
  begin
    if not CharInSet(Text[I], CharsToIgnore) then
      Inc(LSpeechPosition);

    if LSpeechPosition = SpeechPosition then
      Exit(I);
  end;
end;
Yukarıdaki kodu aşağıdaki prosedürden önce bir yere yapıştırın. Bu prosedür içindeki kodu da fonksiyondan dönen bilgiyi kullanacak şekilde (aşağıdaki gibi) düzenlemeniz gerekir:

Kod: Tümünü seç

procedure TfrmTextToSpeech.SpVoice1Word(ASender: TObject; StreamNumber: Integer;
  StreamPosition: OleVariant; CharacterPosition, Length: Integer);
begin
  reText.SetFocus;
  reText.SelStart := FindVisualPosition(reText.Text, CharacterPosition);
  reText.SelLength := Length;
end;
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: richedit sapi

Mesaj gönderen sr1111 »

asagidaki hatayi verdi.
[DCC Error] TextToSpeechSimpleU.pas(43): E2198 Low cannot be applied to a long string
[DCC Error] TextToSpeechSimpleU.pas(43): E2198 High cannot be applied to a long string

Text: array of string
yaptim.
bu seferde bu hatayi verdi.

[DCC Error] TextToSpeechSimpleU.pas(45): E2250 There is no overloaded version of 'CharInSet' that can be called with these arguments
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: richedit sapi

Mesaj gönderen ertank »

Kullandığınız Delphi sürümü eski olmalı. 10.3 ile sorunsuz derleniyor paylaştığım kod. İlgili satırı aşağıdaki şekilde değiştirebilirsiniz.

Kod: Tümünü seç

for I := 1 to Length(Text) do
sr1111
Üye
Mesajlar: 220
Kayıt: 06 Mar 2008 01:59

Re: richedit sapi

Mesaj gönderen sr1111 »

tesekkur ederim. fakat degisen bir sey olmadi gene atliyor.
asagidaki gibi bir sey de yaptim olmadi.
// if not CharInSet(Text, CharsToIgnore) then
if (char(Text) <> #13) or (char(Text) <> #10) then
Cevapla