richedit sapi
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
richedit sapi
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;
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;
Re: richedit sapi
bir fikri olan veya yardımcı olacak yok mu
Re: richedit sapi
Verdigin kod blogu problemin cözümü icin yeterli mi sence?
Benim tahminim; characterposition parametreni yanlis giriyorsun.
Benim tahminim; characterposition parametreni yanlis giriyorsun.
kıdemsiz üye
Re: richedit sapi
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
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
Re: richedit sapi
Merhaba,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;
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.
Re: richedit sapi
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.
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.
Re: richedit sapi
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:
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:
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;
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;
Re: richedit sapi
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
[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
Re: richedit sapi
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
Re: richedit sapi
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
asagidaki gibi bir sey de yaptim olmadi.
// if not CharInSet(Text, CharsToIgnore) then
if (char(Text) <> #13) or (char(Text) <> #10) then