Solved

Getting data from another application..

Posted on 2003-11-14
11
506 Views
Last Modified: 2010-04-05

Hello there Experts!

Is it possible to get data from another external application not build in Delphi?
I have an application written in Visual Basic from which i would like to get data
(string) from its TextEdit fields. I have no possibilities to change the source on
the VB side so all possible programming is to be done in Delphi..

Is this possible ??

Hokki
0
Comment
Question by:hakanfa
  • 7
  • 4
11 Comments
 
LVL 6

Expert Comment

by:GloomyFriar
ID: 9747034
Yes. You can read from TextEdit fields if you know its handlers
0
 
LVL 6

Expert Comment

by:GloomyFriar
ID: 9747057
Here is sample code:

var
 Form1: TForm1;
 g_w_handle: HWND;
 g_w_cap: string;
 g_stage: longint;
 g_str: array[0..2048] of char;


function EnumChildsFunc(wnd: HWND; lParam: longint): longint; stdcall;
var Res: integer;
   str: array[0..1024] of char;
begin
 Res := GetWindowText(wnd, g_str, 2048);

 case g_stage of
   1: begin
     if g_str[0] = #0 then begin
       if StrComp(@g_str[1], 'First Name:') = 0 then begin
         StrPCopy(str, 'alex');
         SendMessage(wnd, WM_SETTEXT, 0, integer(@str[0]));
       end else if StrComp(@g_str[1], 'Last Name:') = 0 then begin
         StrPCopy(str, 'm');
         SendMessage(wnd, WM_SETTEXT, 0, integer(@str[0]));
       end else if StrComp(@g_str[1], 'Gender:') = 0 then begin
         SendMessage(wnd, CB_SETCURSEL, 1, 0);
       end else if StrComp(@g_str[1], 'Zip / Postal Code:') = 0 then begin
         StrPCopy(str, '22222');
         SendMessage(wnd, WM_SETTEXT, 0, integer(@str[0]));
       end else if StrComp(@g_str[1], 'Occupation:') = 0 then begin
         SendMessage(wnd, CB_SETCURSEL, 2, 0);
       end;
     end else if ((StrComp(@g_str[0], '&Contact me from time to time about specials and new products') = 0) or
                  (StrComp(@g_str[0], '„Ÿ„‚„„‡„‡ >') = 0)) then begin
         SendMessage(wnd, BM_CLICK, 0, 0);
     end;
   end;
   2: begin
     if g_str[0] = #0 then begin
       if StrComp(@g_str[1], 'reate My Own') = 0 then begin
         StrPCopy(str, Form1.Edit1.Text);
         SendMessage(wnd, WM_SETTEXT, 0, integer(@str[0]));
       end else if StrComp(@g_str[1], 'e&type Password:') = 0 then begin
         StrPCopy(str, '123123');
         SendMessage(wnd, WM_SETTEXT, 0, integer(@str[0]));
       end else if StrComp(@g_str[1], 'Password:') = 0 then begin
         StrPCopy(str, '123123');
         SendMessage(wnd, WM_SETTEXT, 0, integer(@str[0]));
       end;
     end else if ((StrComp(@g_str[0], 'Create My Own') = 0) or
                  (StrComp(@g_str[0], '&Remember my ID and Password') = 0) or
                  (StrComp(@g_str[0], '„Ÿ„‚„„‡„‡ >') = 0)) then begin
         SendMessage(wnd, BM_CLICK, 0, 0);
     end;
   end;
   3: begin
     if g_str[0] = #0 then begin
       if StrComp(@g_str[1], 'Question we''ll ask:') = 0 then begin
         SendMessage(wnd, CB_SETCURSEL, 2, 0);
       end else if StrComp(@g_str[1], 'our &answer:') = 0 then begin
         StrPCopy(str, '1234567890');
         SendMessage(wnd, WM_SETTEXT, 0, integer(@str[0]));
       end else if StrComp(@g_str[1], 'our &birthday:') = 0 then begin
         StrPCopy(str, '01/01/1975');
         SendMessage(wnd, WM_SETTEXT, 0, integer(@str[0]));
       end else if StrComp(@g_str[1], 'urrent &Email Address:') = 0 then begin
         StrPCopy(str, 'alexn911@hotmail.com');
         SendMessage(wnd, WM_SETTEXT, 0, integer(@str[0]));
       end;
     end else if (StrComp(@g_str[0], '„Ÿ„‚„„‡„‡ >') = 0) then begin
         SendMessage(wnd, BM_CLICK, 0, 0);
     end;
   end;
 end;
end;



procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 if FindWindowByCap('Window caption') <> HWND(-1) then begin
    g_stage := 1;
   FillMemory(@g_str[0], 2048, BYTE('#'));
   EnumChildWindows(g_w_handle, @EnumChildsFunc, 0);
 end;
end;


function FindWindowByCap(text: string): HWND;
begin
 g_w_handle := HWND(-1);
 g_w_cap := text;
 EnumWindows(@EnumFunc, 0);
 Result := g_w_handle;
end;


function EnumFunc(wnd: HWND; lParam: longint): longint; stdcall;
var str: array[0..2048] of char;
   Res: integer;
begin
  Res := GetWindowText(wnd, str, 2048);
  if ((Res > 0) and
      (CompareStr(g_w_cap, StrPas(str)) = 0)) then begin
    g_w_handle := wnd;
    Result := 0;
  end else begin
    Result := 1;
  end;
end;
0
 
LVL 6

Expert Comment

by:GloomyFriar
ID: 9747076
0
NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

 

Author Comment

by:hakanfa
ID: 9749004
Well thank You, but one problem.. I would like to receive (get) data from the other application..

So lets say, I have an application (VB) with caption "DemoForm" and a textedit "DemoText" with a text in it
like "Hello!". How do I get this text into my application..??

Hokki


0
 
LVL 6

Expert Comment

by:GloomyFriar
ID: 9750071
;-)
Just  use WM_GETTEXT instead WM_SETTEXT like that:
SendMessage(wnd, WM_GETTEXT, 64, integer(@str[0]));



// Hint From Help
SendMessage(
  (HWND) hWnd,              // handle to destination window
  WM_GETTEXT,               // message to send
  (WPARAM) wParam,          // number of characters to copy
  (LPARAM) lParam           // text buffer
);

0
 
LVL 6

Accepted Solution

by:
GloomyFriar earned 500 total points
ID: 9750164
Try a bit easier way:

wnd := FindWindow(0, 'DemoText');
SendMessage(wnd, WM_GETTEXT, 64, integer(@str[0]));

Now you have the text in str[] array;

I'm not shure about 'DemoText' because of I don't know how VB give window names. It can be 'CDemoText' or 'TDemoText'
or somethinglike that. But the fullcode which I've posted before will work at any case. You just need adding to EnumChildsFunc whatever you want.

0
 
LVL 6

Expert Comment

by:GloomyFriar
ID: 9750438
By the way could you give me your demo application and I'll write cade sample for it.
0
 

Author Comment

by:hakanfa
ID: 9753495
Very kind of you.. Email?
0
 

Author Comment

by:hakanfa
ID: 9753511
And yes one more thing.. (I've been doin some studing here) is it possible to get the name och the component? Not the ClassName but the name? How is it otherwise possible to know from where the data is retrieved? Like if the "external" application has lets say 3 textedits (FirstName, FamilyName, Address), and I would like to pick up only the address text and put it in my application..??


Thanks,Hokki
0
 
LVL 6

Expert Comment

by:GloomyFriar
ID: 9758086
eric at f2w.net
0
 

Author Comment

by:hakanfa
ID: 9759615
Well GloomyFriar I can not get the email through with that address?
>: Recipient address rejected: This user does not have an account here (MTA:imta13))

Can you please send me a "blanco" email so I get the correct address...
may address hakan.fagerstrom at dg-office.net  

Thanks,
Hokki
0

Featured Post

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Intraweb submit form as a POST request 4 303
Delphi XE2 application frozen on Windows 10 10 311
Path  to current project in Delphi. 2 79
Run video youtube webbrowse 10 61
This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

773 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question