AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Programmübergreifend Steuerelemente aktualisieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programmübergreifend Steuerelemente aktualisieren

Ein Thema von geldis · begonnen am 5. Nov 2023 · letzter Beitrag vom 10. Nov 2023
Antwort Antwort
Seite 1 von 2  1 2      
geldis

Registriert seit: 19. Jan 2022
41 Beiträge
 
#1

Programmübergreifend Steuerelemente aktualisieren

  Alt 5. Nov 2023, 12:04
Hoffentlich versteht das jetzt jemand:

Ich erzeuge in Programm_1 XML Dateien. Der Inhalt wird (unter anderem) in Programm_2 gebraucht. Der Zugriff von Programm_2 auf die Daten des Programms_1 ist nun keine Kunst, aber da diese Daten dort angezeigt werden sollen in einer ListView muss/müsste ich diese ListView aktualiseren, praktischerweise beim beenden von Programm_1.

Wie macht man sowas?

geldis


P.S. Programm_1 wird von Programm_2 aufgerufen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Programmübergreifend Steuerelemente aktualisieren

  Alt 5. Nov 2023, 12:18
Beim Aufrufen warten, bis das Programm fertig ist (SuFu: Hier im Forum suchenShellExecuteAndWait und Gergleichen)
oder anschließend die Datei überwachen und nach Änderung neu laden (SuFu)
oder notfalls ein Timer, der regelmäßg guckt, ob sich die Datei geändert hat (Änderungsdatum oder Inhalt)
$2B or not $2B
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
355 Beiträge
 
#3

AW: Programmübergreifend Steuerelemente aktualisieren

  Alt 5. Nov 2023, 12:28
There is so many ways to do this

1) Run program_1 with command line and pass something like
A) Window handle for message back
B) Named or Unnamed Pipe
C) A file with path with shared write and read protection and pull status on it
... TCP ?!
Any Inter Process Communication IPC .

2) Hardcode the above in program_1 and _2

3) CreateProcess and use timer with GetExitCodeProcess https://learn.microsoft.com/en-us/wi...xitcodeprocess to know if _1 is finished.
....

If you can hardcoded then it is the best, but GetExitCodeProcess is my preferred method to check without blocking on not-my-own applications.
Kas
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Programmübergreifend Steuerelemente aktualisieren

  Alt 5. Nov 2023, 13:20
- hier ein Beispiel, das nach einen Prozess, und dessen Unter-Prozesse sucht.
- es werden Tastenkombinationen ausgetauscht, um den Inhalt zu selektieren und zu kopieren
- uses: TLHelp32, Clipbrd

Delphi-Quellcode:
// get content of "open" hnd8.exe process content editor
procedure TForm2.Button1Click(Sender: TObject);
var
  hSnap : THandle;
  hProc : THandle;
  procWin : THandle;
  priClass : DWORD;
  procEntry: TProcessEntry32;
  childWindowHandles: HWNDArray;
  i : Integer;
  s1, s2, s3: string;
  found: Boolean;
  Input: TInput;
  InputList: TList<TInput>;
begin
  FEditorFrame.RichEdit1.Lines.Clear;
  FCounter := -1;

  // make a snapshot of the current system
  found := false;
  hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hSnap = INVALID_HANDLE_VALUE then
  begin
    ShowMessage('Error: CreateToolhelp32Snapshot');
    exit;
  end;

  // clean init the ProcEntry structure:
  ProcEntry.dwSize := sizeOf(ProcessEntry32);

  // if the processID > 0 ...
  if (Process32First(hSnap, ProcEntry)) then
  begin
    // ... then get the running processes
    while Process32Next(hSnap, ProcEntry) do
    begin
      // if HelpNDoc.exe (hnd8.exe) is found, then
      // internal switch to the process
      s1 := ProcEntry.szExeFile;
      if ExtractFileName(s1) = 'hnd8.exethen
      begin
        priClass := 0;
        hProc := OpenProcess(
        PROCESS_ALL_ACCESS, FALSE,
        ProcEntry.th32ProcessID);

        // get some internal informations about the process:
        priClass := GetPriorityClass( hProc );
        if priClass < 1 then
        ShowMessage('Error: GetPriorityClass');
        CloseHandle(hProc);

        // fill the sub-hwnd container:
        childWindowHandles := FindChildWindowHandles(ProcEntry.th32ProcessID);

        // now, we can iterate the sub-windows:
        for i := 0 to High(childWindowHandles) do
        begin
          s2 := GetWindowCaption(childWindowHandles[i]);
          if System.SysUtils.AnsiPos('- HelpNDoc Personal',s2) = 0 then
          begin
            if System.SysUtils.AnsiPos('- HelpNDoc',s2) > 0 then
            begin
              procWin := childWindowHandles[i];
              s3 := Copy(s2,1,Pos(' -',s2)-1);
              found := true;
              //ShowMessage('>' + s3 + '<');
              break;
            end;
          end;
        end;
      end;
    end;
    if found = true then
    begin
      Winapi.Windows.ShowWindow(procWin,SW_RESTORE);
      Winapi.Windows.SetForegroundWindow(procWin);

      // select all: ctrl+A ...
      InputList := TList<TInput>.Create;
      try
        Input := Default(TInput);
        Input.Itype := INPUT_KEYBOARD;
        Input.ki.wScan := 0;
        Input.ki.time := 0;
        Input.ki.dwExtraInfo := 0;

        // 1. press ctrl key
        Input.ki.dwFlags := 0; // 0 for key-press
        Input.ki.wVk := VK_CONTROL;
        InputList.Add(Input);

        // 2. press "a" key
        Input.ki.dwFlags := 0; // 0 for key-press
        Input.ki.wVk := Ord('A');
        InputList.Add(Input);

        // 3. release "a" key
        Input.ki.dwFlags := KEYEVENTF_KEYUP;
        Input.ki.wVk := Ord('A');
        InputList.Add(Input);

        // 4. release ctrl key
        Input.ki.dwFlags := KEYEVENTF_KEYUP;
        Input.ki.wVk := VK_CONTROL;
        InputList.Add(Input);

        SendInput(InputList.Count, InputList.List[0], sizeof(TInput));

        //s := GetRichViewText(w2);
        //Memo1.Lines.Add(s);
      finally
        InputList.Free;
      end;

      // copy selected text: ctrl+c
      InputList := TList<TInput>.Create;
      try
        Input := Default(TInput);
        Input.Itype := INPUT_KEYBOARD;
        Input.ki.wScan := 0;
        Input.ki.time := 0;
        Input.ki.dwExtraInfo := 0;

        // 1. press ctrl key
        Input.ki.dwFlags := 0; // 0 for key-press
        Input.ki.wVk := VK_CONTROL;
        InputList.Add(Input);

        // 2. press "c" key
        Input.ki.dwFlags := 0; // 0 for key-press
        Input.ki.wVk := Ord('C');
        InputList.Add(Input);

        // 3. release "c" key
        Input.ki.dwFlags := KEYEVENTF_KEYUP;
        Input.ki.wVk := Ord('C');
        InputList.Add(Input);

        // 4. release ctrl key
        Input.ki.dwFlags := KEYEVENTF_KEYUP;
        Input.ki.wVk := VK_CONTROL;
        InputList.Add(Input);

        // copy text to clipboard, sleep could be adjusted for big text:
        SendInput(InputList.Count, InputList.List[0], sizeof(TInput));
        Sleep(250);

        // this does not work:
        FEditorFrame.RichEdit1.Perform(WM_SETTEXT, 0, PWChar(Clipboard.AsText));
      finally
        InputList.Free;
      end;

      // at end, switch back to applicatiin
      Winapi.Windows.SetForegroundWindow(self.Handle);
      FEditorFrame.RichEdit1.PasteFromClipboard;
    end;
  end;
  CloseHandle(hSnap);
end;
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet

Geändert von paule32.jk ( 5. Nov 2023 um 13:22 Uhr) Grund: uses Text hinzugefügt
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

AW: Programmübergreifend Steuerelemente aktualisieren

  Alt 5. Nov 2023, 13:43
Wieso muss ich bei dieser Lösung hieran denken?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Programmübergreifend Steuerelemente aktualisieren

  Alt 5. Nov 2023, 14:13
me?

ich nutze diesen Schnippsel Code dafür, das ich aus einen Tool, das mir XML Daten aufbereitet, dazu, um die Daten dann in HelpNDoc.com Personal zu stöpseln.

Nix schlimmes, da nach mehrmaliger Support-Anfrage bestimmte Dinge in HelpNDoc fehlen, und der Support dann spricht, das ich zusatztools verwenden soll.

Das mit den Input-Key's ist Thread-sicher, was man bei SendMessage manchmal nicht sagen kann, da es da zu überschneidungen kömmen kann.

Um bissl Werbung zu machen: HelpNDoc ist prima für Hilfe-Dokumente zu erstellen.
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Programmübergreifend Steuerelemente aktualisieren

  Alt 5. Nov 2023, 14:45
SendMessage ist immer thread-safe, da es sich in den Ziel-Thread synchronisiert (der, wo das WinControl erstellt wurde)

PostMessage und PostThreadMessage können per se nur thread-safe sein, da sie in der MessageQueue des Ziel-Threads landen und jener kann nur sequentiell abgearbeitet werden.
$2B or not $2B
  Mit Zitat antworten Zitat
geldis

Registriert seit: 19. Jan 2022
41 Beiträge
 
#8

AW: Programmübergreifend Steuerelemente aktualisieren

  Alt 5. Nov 2023, 15:52
Besten Dank an alle!

Am einfachsten war der Timer Vorschlag. Ich bin bei dem Teil immer etwas skeptisch, aber in diesem Fall reicht das völlig aus.

geldis
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
691 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Programmübergreifend Steuerelemente aktualisieren

  Alt 6. Nov 2023, 15:36
<OT>
Wieso muss ich bei dieser Lösung hieran denken?
Unrecht hast du leider nicht. Nur dass es im aktuellen Fall anders geartet ist. Ein / zwei Nutzer überziehen alles mit mehr oder weniger nutzlosen Quelltexten. Als wenn es einen Wettbewerb gäbe fürs zukleistern von Postings.
Ja, ist schön dass es dir auffällt. Du kannst gene deine Gedanken beisteuern. Jede weitere Idee ist eine Bereicherung für den TE und alle die irgendwann mal das gleiche Problem haben.
Aber einfach einen Quelltext hinzurotzen, der auch noch größtenteils am Ziel vorbeigeht, ist einfach unnötig.
</OT>
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Programmübergreifend Steuerelemente aktualisieren

  Alt 6. Nov 2023, 16:35
Besten Dank an alle!

Am einfachsten war der Timer Vorschlag. Ich bin bei dem Teil immer etwas skeptisch, aber in diesem Fall reicht das völlig aus.

geldis
Hmmm... warum unnötig polling betreiben wenn man es bequem per SendMessage() lösen könnte oder wie der englische Kollege schrieb per CallBack als parameter deiner zweiten Anwendung.
Ich pers. würde mir einen Message Handler in Programm_B anlegen und beim Beenden von Programm_A eine Nachricht an Programm_B schicken, was dann halt alles mögliche ausführen kann ...
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz