Tema: Re: Klausimas is Delphi
Autorius: Žilvinas Ledas
Data: 2009-04-29 22:05:28
Na, išties tai viskas paprasta, kai suvoki, kaip veikia kodas :)

Pamąstykime taip: tu nori, kad tavo pasiųstas keyboard event'as (lt. 
vadinkime įvykis) "backspace" įvyktų pirma negu dabar "vykstantis" "a" 
įvykis. Tačiau taip neįvyksta. Kodėl? O atsakymas elementarus :) juk 
"backspace" ir negali įvykti, nes dabar vyksta "a" įvykis ir tu gauni 
veiksmų eilę, kuri ir turi būti: ..., "a", "backspace", ... .

Ką daryti? Ogi tereikia iškviesti application.ProcessMessages, kas, 
paprastai sakant, priverčia apdoroti susikaupusias žinutes, tame tarpe 
ir "backspace" įvykį. Taip įvykių eilė pasidaro tokia (supaprastintai): 
...., pradedamas vykdyti "a" (bet dar neįrašomas pats a simbolis), 
application.ProcessMessages priverčia vykti "backspace", įvyksta "a", ...

Taigi, kodas:

  if Key='a' then
   begin
     keybd_event(VK_BACK, 0, 0, 0);
     keybd_event(VK_BACK, 0, KEYEVENTF_KEYUP, 0);
     application.ProcessMessages;
   end;


Gero vakaro,
Žilvinas

ReM wrote:
> Taip. Čia viskas suprantama. Bet ađ norëjau padaryt tā patá kitaip 
> (paprasčiau).  keybd_event(VK_BACK, 0, 0, 0); imituoja klaviđo Backspace 
> paspaudimā. Tačiau simbolis "a" pasirodo pirmiau, nei suveikia klaviđo 
> paspaudimo imitacija. Todël ir nutrina bûtent "a". Jei suveiktø pirmiau, 
> bûtø tai, ko man reikia. Iđ tikro pas mane ten viskas daug sudëtingiau. Čia 
> tik toká testā padariau, kaip turëtø bût. Matomai kol neiđeina iđ KeyPress 
> procedûros keybd_event nesuveikia. Tavo nurodyto bûdo ađ naudoti negalësiu, 
> nes viskas bus svetimos programos lange. Arba kitas variantas bûtø sugalvot, 
> kaip tā patá atlikt svetimam lange.
> 
> "Ninja666" <Ninja666@microsoft.com> wrote in message 
> news:gt8o0t$v2p$1@trimpas.omnitel.net...
>> ReM wrote:
>>> Sveiki,
>>>
>>> Paprastutë klaviđo paspaudimo procedûra. Reikia, kad paspaudus "a", 
>>> iđtrintø prieđ tai esantá simbolá.
>>> Tikëjausi, kad taip nutrins, tačiau nutrina bûtent simbolá "a".
>>>
>>> procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
>>> begin
>>>  if Key='a' then
>>>   begin
>>>     keybd_event(VK_BACK, 0, 0, 0);
>>>     keybd_event(VK_BACK, 0, KEYEVENTF_KEYUP, 0);
>>>   end;
>>> end;
>>>
>>> Kaip padaryt, kad nutrintø prieđ kursoriø esantá simbolá? "a" irgi turi 
>>> pasirodyt.
>>>
>> Kaūkaip tu darai pro kitā galā. Nesuprantu ko tu nori, todël pateikiu 
>> pavyzdukā tam, ko tu prađai, bet ađ spëju, kad tu darai kaūkā iđ visiđkai 
>> kitos pusës.
>>
>> procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
>> var
>>   vText: string;
>>   vSelPos: integer;
>> begin
>>   if key = 'a' then
>>   begin
>>     vText := Edit1.Text;
>>     vSelPos := Edit1.SelStart;
>>     Delete(vText, vSelPos, 1);
>>     Edit1.Text := vText;
>>     Edit1.SelStart := vSelPos;
>>   end;
>> end;
>>
>>
>> beje - vSelPos reikës skaičiuoti kitaip, jeigu tekstas bus paūymëtas. Tada 
>> reikës ir vText skaičiuot kitaip :) 
> 
>