AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Anstatt ID den Namen verwenden?

Ein Thema von Mirco · begonnen am 27. Jun 2006 · letzter Beitrag vom 30. Jul 2006
Antwort Antwort
Seite 2 von 3     12 3      
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Anstatt ID den Namen verwenden?

  Alt 29. Jun 2006, 12:13
Moin Mirco,

wenn ich das richtig verstanden habe, so benötigtst Du doch eine bestimmte ComboBox.
Wenn nun die ID nicht eindeutig ist, so könntest Du mittels EnumChildWindows durch alle Bestandteile des Formulares durchgehen, und die Klasse prüfen. Stimmt die Klasse überein, noch die Position des Controls prüfen. Stimmt die mit dem gesuchten überein, den Text auslesen. Evtl. genügt natürlich auch die Prüfung der Position.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Mirco

Registriert seit: 6. Mai 2006
71 Beiträge
 
#12

Re: Anstatt ID den Namen verwenden?

  Alt 29. Jun 2006, 12:21
Hallo Christian,
ich hab schonmal folgendes gemacht, bekomme aber immer nur die erste Checkbox zurück.
Bin ich mit dem Beispiel schon auf dem richtigen Weg?
Grüsse Mirco
Delphi-Quellcode:
const
  WinName = 'Fax 1.1';
  WinClass = nil;

implementation

{$R *.dfm}

function EnumProc(StHandle: HWND; lines: TStrings): boolean; stdcall;
var
  buffer, desc: array[0..100] of char; // max. 101 Zeichen
begin
  GetClassname(StHandle, buffer, 100); // 100
  GetWindowText(StHandle, desc, 100); // 100
  lines.add(format('ID: %d, Class: %s, Text: %s', [GetDlgCtrlID(StHandle), buffer, desc]));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hwnd: dword;
begin
  Memo1.clear;
  hwnd := FindWindow(WinClass, WinName);
  if hwnd <> 0 then
  begin
    showmessage(IntToStr(hwnd));
    if (hwnd = 0) then
    begin
      messagebox(0, 'Programm nicht im Speicher!', 'Warning!', 0);
      exit;
    end;
    EnumChildWindows(hwnd, @EnumProc, Integer(Memo1.Lines));
  end;
end;
Mirco Hallenga
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#13

Re: Anstatt ID den Namen verwenden?

  Alt 29. Jun 2006, 12:31
Hallo,
probier mal folgendes
Delphi-Quellcode:
function EnumProc(StHandle: HWND; lines: TStrings): boolean; stdcall;
var
  buffer, desc: array[0..100] of char; // max. 101 Zeichen
begin
  GetClassname(StHandle, buffer, 100); // 100
  GetWindowText(StHandle, desc, 100); // 100
  lines.add(format('ID: %d, Class: %s, Text: %s', [GetDlgCtrlID(StHandle), buffer, desc]));
  EnumChildWindows(StHandle, @EnumProc, Integer(Lines));
end;
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Anstatt ID den Namen verwenden?

  Alt 29. Jun 2006, 13:04
Moin Mirco,

Du hast in der EnumProc eine wichtige Zeile vergessen:

Result := true; Ich denke mal, dass Dir der Compiler auch ein Warning ausgegeben hat, dass der Rückgabewert unbestimmt ist.
Aller Voraussicht nach ist der Wert von Result gleich false, so dass nach dem ersten gefundenen Control abgebrochen wird.

BTW:
Korrekter als Boolean ist Longbool als Rückgabewert der Funktion.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Palando

Registriert seit: 5. Mai 2005
72 Beiträge
 
#15

Re: Anstatt ID den Namen verwenden?

  Alt 29. Jun 2006, 13:27
Zitat von Christian Seehase:
Korrekter als Boolean ist Longbool als Rückgabewert der Funktion.

Wieso das? Wo liegt der Unterschied?
Markus
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Anstatt ID den Namen verwenden?

  Alt 29. Jun 2006, 13:46
Moin Markus,

BOOL ist ein 32 Bit grosser Rückgabewert, genauso wie Longbool, wohingegen boolean nur ein Byte gross ist.
Ersatzweise kann man auch BOOL nehmen (in der Windows.pas ist BOOL als Longbool deklariert).

Je nachdem, welche Windows-Headerdatei man heranzieht, ist BOOL als int (windef.h) oder long (wtypes.h) deklariert.
Beide Typen entsprechen dem integer in Delphi.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Palando

Registriert seit: 5. Mai 2005
72 Beiträge
 
#17

Re: Anstatt ID den Namen verwenden?

  Alt 29. Jun 2006, 14:25
Ahja.

Danke, wieder was gelernt
Markus
  Mit Zitat antworten Zitat
Mirco

Registriert seit: 6. Mai 2006
71 Beiträge
 
#18

Re: Anstatt ID den Namen verwenden?

  Alt 29. Jun 2006, 15:43
Hallo
Danke für eure Antworten.
Ich hab nun folgendes übernommen, obwohl ich die Änderung nicht verstanden habe:
Delphi-Quellcode:
function EnumProc(StHandle: HWND; lines: TStrings): boolean; stdcall;
var
  buffer, desc: array[0..100] of char; // max. 101 Zeichen
begin
  GetClassname(StHandle, buffer, 100); // 100
  GetWindowText(StHandle, desc, 100); // 100
  lines.add(format('ID: %d, Class: %s, Text: %s', [GetDlgCtrlID(StHandle), buffer, desc]));
  EnumChildWindows(StHandle, @EnumProc, Integer(Lines));
  Result := true;
end;
Damit bekomm ich nun die einzelnen Komponenten inkl. ID angezeigt, leider wird der Text meiner Combobox nicht ausgelesen, woran kann das liegen?


Ist Result Longbool?

Viele Grüsse
Mirco
Mirco Hallenga
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: Anstatt ID den Namen verwenden?

  Alt 29. Jun 2006, 16:02
Moin Mirco,

da es sich um ein Control handelt, dass zu einem anderen Prozess gehört, solltest Du mal
SendMessage(StHandle,WM_GETTEXT,101,lParam(@desc[1]); nehmen statt GetWindowText.

Vielleicht hilft das schon.

[EDIT]
Zitat von Mirco:
Ist Result Longbool?
ist es bei Dir nicht, sollte es aber sein, da die Callback-Funktion von EnumChildWindows als Rückgabewert BOOL erwartet.
[/EDIT]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Mirco

Registriert seit: 6. Mai 2006
71 Beiträge
 
#20

Re: Anstatt ID den Namen verwenden?

  Alt 29. Jun 2006, 16:16
Hallo Christian,

nun klappt es mit dem Text auslesen.
Vielen Dank, ich werde mit Sicherheit noch einige Zeit brauchen bis ich das alles verstanden haben, aber es ist echt ein verdammt spannendes Thema.

ich hab das jetzt so gemacht.
Delphi-Quellcode:
var
  Result:Longbool;
Viele Grüsse und vielen Dank an alle die mitgedacht haben.
Mirco
Mirco Hallenga
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 04:58 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