Avatar billede klasker Nybegynder
27. september 2003 - 10:46 Der er 13 kommentarer og
1 løsning

Redigering af komponent i et andet program.

Jeg har før stillet et spørgsmål om hvordan man aflæser data fra et andet program. Jeg fik også et udemærket svar, problemet er bare at jeg nu har opdaget et masse fejl.
Her den kode jeg bruger når jeg skal skrive til det andet program:
procedure SetTriggerText(S: String);
var
  Wnd: HWND;
  ClassName: array[0..144] of char;
  Num: Integer;
begin
  Num := 0;
  { Find the "calc" window }
  Wnd := FindWindow(PCHAR('#32770'), NIL);
  if Wnd <> 0 then
  begin
    { get the first child window... }
    Wnd := GetWindow(Wnd, GW_CHILD);
    repeat
      { ...and search the siblings for the first class named
"Static" }
      GetClassName(Wnd, @ClassName, SizeOf(ClassName));
      if StrComp(ClassName, 'Edit') = 0 then
      begin
        Num := Num + 1;
        if Num = 2 then // Edit #2 is one we want
        begin
          SendMessage(Wnd, WM_SETTEXT, 0, Integer(S));
          Exit;
        end;
      end; { if StrComp... }
      Wnd := GetWindow(Wnd, GW_HWNDNEXT);
    until (Wnd = 0);
  end;
end;


Og her er den til når jeg aflæser:



function GetTriggerText: string;
var
  Wnd: HWND;
  ClassName: array[0..144] of char;
  L: Integer;
  Num: Integer;
begin
  Result := '';
  Num := 0;
  { Find the "calc" window }
  Wnd := FindWindow(PCHAR('#32770'), NIL);
  if Wnd <> 0 then
  begin
    { get the first child window... }
    Wnd := GetWindow(Wnd, GW_CHILD);
    repeat
      { ...and search the siblings for the first class named
"Static" }
      GetClassName(Wnd, @ClassName, SizeOf(ClassName));
      if StrComp(ClassName, 'Edit') = 0 then
      begin
        Num := Num + 1;
        if Num = 2 then // Edit #2 is one we want
        begin
          { get the text length }
          L := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
          if L > 0 then
          begin
            { allocate space for the text }
            SetString(Result, NIL, L);
            { get the text (into Result) }
            SendMessage(Wnd, WM_GETTEXT, L, Longint(@Result[1]));
            { set actual size }
            SetLength(Result, StrLen(PCHAR(Result)));
          end;
          Exit;
        end;
      end; { if StrComp... }
      Wnd := GetWindow(Wnd, GW_HWNDNEXT);
    until (Wnd = 0);
  end;
end;



Problemerne er:
1) Når jeg skriver til komponentet, så gemmer den ikke den tekst jeg har skrevet. Jeg gætter på at grunden er at den ikke kører sin onChange eller hvad det nu er, når jeg bruger SendMessage.

2) Både aflæsning og indsætning af tekst virker tilsyneladende kun nogle gange. De gange hvor det ikke virker hjælpe det som regel (ikke sikker på at det virker hver gang) at lave en lille ændring i teksten først.


Jeg vil meget gerne have hjælp til at løse de to problemer.
Hvis i vil vide noget specifikt de pågældende programmer så bare sig til, dog har jeg kun adgang til kildekoden i det program som aflæser/skriver til det andet.

Tak.
Avatar billede Slettet bruger
27. september 2003 - 11:30 #1
http://hejhej105.frac.dk/trigger.jpg

Er det, det felt jeg har markeret du vil ændre i??
Avatar billede Slettet bruger
27. september 2003 - 11:58 #2
1. Hvad mener du med den ikke gemmer teksten du har skrevet??

2. Prøv det her:

function GetTriggerText: String;
var
Handle:HWND;
begin
    Handle := FindWindow('#32770', 'Trigger Editor');
    Handle := GetWindow(Handle, GW_CHILD);
    repeat
      if GetWindowLong(Handle, GWL_STYLE) = 1344344132 then
      begin
        SetLength( Result, SendMessage( Handle, WM_GETTEXTLENGTH, 0, 0 )+1);
        SendMessage( Handle, WM_GETTEXT, Length(Result), integer(Result));
        Break;
      end;
      Handle := GetNextWindow(Handle, GW_HWNDNEXT)
    until Handle = 0;
end;

procedure SetTriggerText(S: String);
var
Handle:HWND;
begin
    Handle := FindWindow('#32770', 'Trigger Editor');
    Handle := GetWindow(Handle, GW_CHILD);
    repeat
      if GetWindowLong(Handle, GWL_STYLE) = 1344344132 then
      begin
        Handle := FindWindowEx(FindWindow( '#32770', 'Trigger Editor'),0,'Edit',nil);
        SendMessage(Handle, WM_SETTEXT,0,Integer(S));
        Break;
      end;
      Handle := GetNextWindow(Handle, GW_HWNDNEXT)
    until Handle = 0;
end;
Avatar billede klasker Nybegynder
27. september 2003 - 12:29 #3
Nej. Tryk på "Edit" og så "Convert trigger to custom text". Det er den box hvor koden står i, jeg vil ændre.

Jeg mener at vis jeg gemmer teksten til editoren, så bliver teksten ændret, men hvis jeg vælger en anden trigger bliver ændringerne tabt. Man kan godt få den til at gemme dem ved at lave en lille ændring i koden. F.eks at lave et mellemrum og slette det igen.

Den kode du gav mig redigerer kommentar boksen, dvs den som du markerede i billedet.

Du kan prøve min editor her og se hvad jeg mener:
http://www.wc3modforge.com/download.php?download_file=56
Avatar billede Slettet bruger
27. september 2003 - 12:38 #4
Ahh.. så fandt jeg den :-)

Prøv det her istedet:

function GetTriggerText: String;
var
Handle:HWND;
begin
    Handle := FindWindow('#32770', 'Trigger Editor');
    Handle := GetWindow(Handle, GW_CHILD);
    repeat
      if GetWindowLong(Handle, GWL_STYLE) = $50311044 then
      begin
        SetLength( Result, SendMessage( Handle, WM_GETTEXTLENGTH, 0, 0 )+1);
        SendMessage( Handle, WM_GETTEXT, Length(Result), integer(Result));
        Break;
      end;
      Handle := GetNextWindow(Handle, GW_HWNDNEXT)
    until Handle = 0;
end;

procedure SetTriggerText(S: String);
var
Handle:HWND;
begin
    Handle := FindWindow('#32770', 'Trigger Editor');
    Handle := GetWindow(Handle, GW_CHILD);
    repeat
      if GetWindowLong(Handle, GWL_STYLE) =  $50311044 then
      begin
        SendMessage(Handle, WM_SETTEXT,0,Integer(S));
        Break;
      end;
      Handle := GetNextWindow(Handle, GW_HWNDNEXT)
    until Handle = 0;
end;
Avatar billede klasker Nybegynder
27. september 2003 - 22:33 #5
Den gemmer stadig ikke ændringerne... men koden er en del simplere end min så den vil jeg bruge, tak for det.
Men den gemmer stadig ikke ændringerne... Er der en måde hvorpå jeg kan få den til at køre sin onChange event?

Kan SendNotifyMessage måske bruges til noget her???
Avatar billede Slettet bruger
27. september 2003 - 22:38 #6
Ved ik hvordan man sender en onchange, men du kan prøve:

SendNotifyMessage(Memo1.Handle, EN_CHANGE,0,0);

Eller:

SendMessage(Memo1.Handle, EN_CHANGE,0,0);
Avatar billede Slettet bruger
27. september 2003 - 22:49 #7
Har fundet ud af hvordan man sender en OnChange til en TMemo:

SendMessage(Memo1.Handle, CM_TEXTCHANGED,0,0);
Avatar billede klasker Nybegynder
27. september 2003 - 23:07 #8
Virker ikke :(

Jeg prøvede lige at gøre det med et program jeg selv lavede, og konstaterede at det rent faktisk kører dens onChange. Måske er det keyDown eller sådan noget der skal køres?
Hvordan bruger man SendInput() ??
Avatar billede Slettet bruger
27. september 2003 - 23:10 #9
Ved ik hvordan man bruger SendInput, men prøv at send en wm_keydown:

PostMessage(Handle, WM_KEYDOWN, VK_SPACE, 0);
Avatar billede klasker Nybegynder
27. september 2003 - 23:20 #10
JUBIIIIIIIIII!!!!
Det virker! :D
Jeg satte lige en PostMessage mere ind med en VK_BACK for at få fjernet mellemrummet igen!
Tak for hjælpen!
Og læg lige et svar ;)
Avatar billede Slettet bruger
27. september 2003 - 23:21 #11
Svar ;-)
Avatar billede Slettet bruger
27. september 2003 - 23:22 #12
Avatar billede klasker Nybegynder
27. september 2003 - 23:33 #13
Nej, tak... hvis der er noget jeg er træt af nu er det at rode i windows' underlige kode :o|
Avatar billede Slettet bruger
27. september 2003 - 23:35 #14
hehe :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester