Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi D5 + Liste überwachter Ausdrücke speichern??? (https://www.delphipraxis.net/124849-d5-liste-ueberwachter-ausdruecke-speichern.html)

Bomberbb 26. Nov 2008 10:34


D5 + Liste überwachter Ausdrücke speichern???
 
Hallo ich suche eine Möglichkeit (in Delphi5), das was in 'Liste überwachter Ausdrücke' steht zu speichern. Gibt es Da eine Möglichkeit?
Das wäre mir eine deutliche Hilfe beim Debuggen.

Gruß

BBB

toms 29. Nov 2008 21:35

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Hallo

Möchtest du die Ausdrücke nach dem Speichern wieder Laden?

Bomberbb 1. Dez 2008 07:30

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Nein, ich möchte eigentlich nur Ausdrücke und Werte in eine Textdatei schreiben, um die Fehlersuche zu vereinfachen. Habe es sehr oft, da bräuchte ich mir nicht immer den Inhalt der Variablen zu notieren, wenn ich sie vergleichen will.

toms 1. Dez 2008 09:11

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Es wird wohl keine (einfache) Möglichkeit geben, diese Werte zu speichern.

himitsu 1. Dez 2008 10:27

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Würde es dir reichen, es üger ein Externes Programm zu machen?

TWatchWindow (frei) oder TEditorDockPanel (angedockt) suchen
(eventuell noch Strg+Alt+W simmulieren und es anzeigen lassen)

darauf ist dann TTabSet und 'ne TListView

und dann die ListView entsprechend ansteuern
notfalls ebenfalls via Tastensimulation
- Strg+E (Ausdruck editieren) und dann die Komopnenten (Edits und CheckBoxen) auslesen
- Strg+A (Asdruck erstellen) und dann die Komopnenten beschreiben

Bomberbb 1. Dez 2008 10:43

Re: D5 + Liste überwachter Ausdrücke speichern???
 
ich werde es mir mal anschauen...
danke

gibt es da einen Link zu, hab auf die Schnelle bei Google nichts gefunden...

himitsu 1. Dez 2008 11:57

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Nee, du müßttest halt die Fenster/Komponenten suchen (z.B. MSDN-Library durchsuchenFindWindow/MSDN-Library durchsuchenEnumWindows, ansonsten gibt es auch einige Beispiele/Codes dazu im Forum und in den JEDIs ist bestimmt auch noch was Schönes dazu zu finden) und dann auf diese zugreifen.

Und das Ganze dann in einem kleinen Programm verbauen, welches sich bestimmt gut per TrayIcon neben der Uhr verstecken könnte.

toms 1. Dez 2008 12:10

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Zitat:

Zitat von himitsu
TWatchWindow (frei) oder TEditorDockPanel (angedockt) suchen
(eventuell noch Strg+Alt+W simmulieren und es anzeigen lassen)

Stellt sich die Frage, ob unter D7 die Kompoennten auch so heißen.
Bei D6 ist es ein DrawGrid (o.ä.), welches sich nicht per WM_GETTEXT o.ä. auslesen läßt

Bomberbb 1. Dez 2008 14:12

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Hab jetzt einiges probiert, aber leider funzt es nicht...
Code:
program Project2;
uses
  sysutils,
  windows,
  messages,
  classes,
  dialogs;


var
  hMain: DWORD;
  hSub: DWORD;
  iLen: integer;
  pText: PChar;

begin
  hMain := FindWindow(nil, 'Delphi 5');
  if (hMain = 0) or (hMain = INVALID_HANDLE_VALUE) then begin
    ShowMessage('Meldung nicht gefunden'#13#10 + SysErrorMessage(GetLastError));
    Exit;
  end
  else
  begin
    hSub := FindWindowEx(hMain, 0, 'TDrawGrid', NIL);

    if hSub = 0 then begin
      ShowMessage('Inhalt nicht gefunden'#13#10 + SysErrorMessage(GetLastError));
      Exit;
    end
    else
    begin
      iLen := SendMessage(hSub, WM_GETTEXTLENGTH, 0, 0) + 1;
      if iLen = 0 then begin
        ShowMessage('Kein Inhalt');
        Exit;
      end
      else
      begin
        pText := AllocMem(iLen);
        try
          if SendMessage(hSub, WM_GETTEXT, wParam(iLen), lParam(pText)) = 0 then begin
            ShowMessage('0 Zeichen kopiert');
          end else begin
            showmessage(pText);
          end;
        finally
          FreeMem(pText, iLen);
        end;
      end;
    end;
  end;
end.
FindWindowEx gibt 0 aus. Und wenn ich mit WinSpy das Handle ermittle und manuell eintrage, dann wird kein Text ausgelesen...

toms 1. Dez 2008 14:15

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Zitat:

Zitat von Bomberbb
Hab jetzt einiges probiert, aber leider funzt es nicht...

Wird auch nicht.

Zitat:

Zitat von toms
Bei D6 ist es ein DrawGrid (o.ä.), welches sich nicht per WM_GETTEXT o.ä. auslesen läßt


Bomberbb 2. Dez 2008 07:51

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Schade!

:(

Also bleibts auch im digitalen Zeitalter bei Zettel und Stift...

Bomberbb 3. Dez 2008 13:02

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Hab doch noch eine Lösung gefunden und möchte Euch natürlich noch dran teilhaben lassen. Mein Kollege hat mir verraten, dass man mit STRG+C die aktuell markierte Zeile in den überwachten Ausdrücken kopieren kann. Drum hab ich mir ein kleines Prog geschrieben, dass die Zeilen dann direkt in eine Datei schreibt:
Delphi-Quellcode:
program ClipboardTextToFile;

uses
  sysutils,
  dialogs,
  Classes,
  Windows,
  clipbrd;

var
  Liste: TStringlist = nil;
  Ablage: TClipBoard = nil;
  Dateiname: string = 'clipboard.txt';
begin
  //Tastendruck strg+c simmulieren
  keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
  keybd_event(99, 81, 0, 0);
  keybd_event(99, 81, KEYEVENTF_KEYUP, 0);
  keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);

  if paramcount > 0 then
  begin
    if (uppercase(paramstr(1)) = '/HELP') or (paramstr(1) = '/?') then
    begin
      showmessage('Fügt den Inhalt der Zwischenablage an eine Datei an, die als Parameter übergeben wird');
      Dateiname:='';
    end
    else
      Dateiname := Paramstr(1);
  end;

  try
    Ablage := TClipBoard.Create;
    Liste := TStringlist.create;
    if Fileexists(Dateiname) then
      Liste.LoadFromFile(Dateiname);
    Liste.add(Ablage.AsText);
    Liste.SaveToFile(Dateiname);
  finally
    Liste.Free;
    Ablage.Free;
  end;
end.
Das ganze auf eine Sondertaste meiner Tastatur gelegt... und es funzt wunderbar.

Bomberbb 3. Dez 2008 14:01

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Ok, es funzte doch nicht so wunderbar.
Anscheinend muss man mit
Delphi-Quellcode:
Ablage := TClipBoard.Create;
noch so lange warten, bis die Daten auch im Zwischenspeicher sind.
Also:

Delphi-Quellcode:
Slepp(100);
Ablage := TClipBoard.Create;

toms 4. Dez 2008 06:36

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo

Ich habe nun meinen eigenen (Quick&Dirty) "Watch List-Saver" geschrieben.
Sollte unter D5 - D2009 funktionieren (getestet mit D6/D2009)

Funktion: Speichert alle Einträge der "Watch Liste" in eine Datei.
Wahlweise macht es ein "Append"

Verwendete Funktionen:

Delphi-Quellcode:
procedure PostKeyEx(hWindow: HWnd; key: Word; const shift: TShiftState; SpecialKey: Boolean);
procedure SelectAll_CopyClipboard(wndParent, wndChild: HWND; bChildVST: Boolean);
function SaveClipBoardToFile(FileName: string; bAppendFile: Boolean): string;
function HandleParamstr(out FileName: string; out bAppendFile: Boolean): Boolean;
function FindWatchWindow(out wndWatchWindow, wndChild: HWND; out bChildVST: Boolean): Boolean;
Einfacher Aufruf: SaveWatchList.exe [AusgabeDatei]

Hinweise: Funktioniert nicht, wenn das Watch Fenster angedockt ist, wenn mehrere Watch Fenster offen sind, findet es evtl. nicht das gewünschte.

PS: Lässt sich z.B als Tool in der Delphi IDE hinzufügen. (Tools | Configure Tools...)

Bomberbb 4. Dez 2008 13:36

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Nun bei mir funktioniert es leider nicht.
Ich kann in dem Feld 'Liste überwachter Ausdrücke' Leider nicht alles markieren.
bei der Zeile
Delphi-Quellcode:
PostKeyEx(wndChild, VK_END, [ssCtrl, ssShift], True);
Springt er nur zum Ende und kopiert dann den letzten leeren Ausdruck!

Bomberbb 4. Dez 2008 15:54

Re: D5 + Liste überwachter Ausdrücke speichern???
 
So, ich habe auch noch ein bissel gebastelt und nun funzt es. Hab aber nur mit Delphi 5 getestet. Dafür scheint es jetzt auch bei angedocktem Fenster zu funktionieren und auch bei mehreren Fenstern, dafür aber nur für die deutsche Delphi Version.

@toms:

Sag mal, ist der TVirtualStringTree für höhere Delphiversionen??? Hier beim Testen hab ich den Pfad nie durchlaufen.

toms 4. Dez 2008 19:31

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Zitat:

Zitat von Bomberbb
Nun bei mir funktioniert es leider nicht.
Ich kann in dem Feld 'Liste überwachter Ausdrücke' Leider nicht alles markieren.
bei der Zeile
Delphi-Quellcode:
PostKeyEx(wndChild, VK_END, [ssCtrl, ssShift], True);
Springt er nur zum Ende und kopiert dann den letzten leeren Ausdruck!

Wird denn alles markiert, wenn du von Hand Ctrl+Shift+End drückst?
(oder bei Shift+End ?)

Zitat:

Zitat von Bomberbb
Sag mal, ist der TVirtualStringTree für höhere Delphiversionen??? Hier beim Testen hab ich den Pfad nie durchlaufen.

Bei den neueren Delphi Versionen (ab D2005?) wurde das DrawGrid durch einen VST ersetzt.

Zitat:

Zitat von Bomberbb
und auch bei mehreren Fenstern, dafür aber nur für die deutsche Delphi Version.

Mit diesen Änderungen sollte es auch bei der englischen Version funktionieren:
("(Pos('Watch List', Caption) > 0)" hinzugefügt.)


Delphi-Quellcode:
function EnumProcTTabSheet(wnd: HWND; pwnd: pHWND): BOOL; stdcall;
var
  buf, Caption: array[0..255] of Char;
begin
  Result := True;
  GetClassName(wnd, buf, SizeOf(buf) - 1);
  SendMessage(wnd, WM_GETTEXT, 256, Integer(@Caption));
  if (buf = 'TTabSheet') and ((Pos('Liste überw', Caption) > 0) or (Pos('Watch List', Caption) > 0)) then
  begin
    pwnd^ := wnd;
    Result := False;
  end;
end;

function EnumProcTWatchWindow(wnd: HWND; pwnd: pHWND): BOOL; stdcall;
var
  buf, Caption: array[0..255] of Char;
begin
  Result := True;
  GetClassName(wnd, buf, SizeOf(buf) - 1);
  SendMessage(wnd, WM_GETTEXT, 256, Integer(@Caption));
  if (buf = 'TWatchWindow') and ((Pos('Liste überw', Caption) > 0) or (Pos('Watch List', Caption) > 0)) then
  begin
    pwnd^ := wnd;
    Result := False;
  end;
end;

Bomberbb 5. Dez 2008 09:04

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Zitat:

Wird denn alles markiert, wenn du von Hand Ctrl+Shift+End drückst?
(oder bei Shift+End ?)
Nein, bei mir scheinen Mehrfachmarkierungen nicht möglich zu sein.

Hab jetzt auch noch Fehler behoben und die Tastenkombinationen für 'IDE-Klassisch' eingefügt.

toms 5. Dez 2008 09:06

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Zitat:

Zitat von Bomberbb
Zitat:

Wird denn alles markiert, wenn du von Hand Ctrl+Shift+End drückst?
(oder bei Shift+End ?)
Nein, bei mir scheinen Mehrfachmarkierungen nicht möglich zu sein.

Schade..Ab D6 ist eine Mehrfachmarkierung möglich. Somit muss nicht jeder einzelne Eintrag in die Zwischenablage kopiert werden, was natürlich effizienter ist.

Bomberbb 5. Dez 2008 10:20

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Na schöner wäre es schon, aber ich denke bei so einem kleinen Prog ist das mit der Effizienz nicht ganz so schlimm...

Bomberbb 12. Dez 2008 11:34

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nun hab ichs zum ersten Mal im produktiven Einsatz gehabt, und:

es funzt natürlich nicht.

Das Problem ist diese Zeile:

Delphi-Quellcode:
  SendMessage(wnd, WM_GETTEXT, 256, Integer(@Caption));
Das Programm wartet in dieser Zeile, bis Delphi den Debugger beendet hat, was das Programm natürlich unsinnig macht.
Momentan bleibt nur die Möglichkeit, die Abfrage nach der Caption rauszunehmen. Ich hoffe mal, dass dennoch das richtige Fenster gefunden wird. Bei scheint es auch ohne die Captionabfrage zu laufen.

Bomberbb 26. Feb 2010 07:23

Re: D5 + Liste überwachter Ausdrücke speichern???
 
Hallo,

ich muss da Thema mal wieder hochholen. Ich habe jetzt ein Jahr mit dem Prog wunderbar gearbeitet. Nun hab ich aber einen neuen Rechner (WIN7x64). Und nun funzt es nicht mehr. Ich weiß nicht, was anders läuft. Zumindest schneint PostkeyEx nicht mehr zu funktionieren...

Ich arbeite mit Delphi 5 und angedocktem Watchlistfenster.

Kann mir wer weiterhelfen? Hab schon einiges Probiert, komme aber einfach nicht weiter....

Gruß

BBB


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz