![]() |
For each in Delphi
Das alte leidige Problem ;)
Ich habe zwei Classen TClsProgBar..TClsButtonInfo Mein Anliegen ist zu erfahren wie viele Button sich in goProgBar befinden.
Delphi-Quellcode:
goProgBar: TClsProgBar;
Delphi-Quellcode:
Das Delphi Interne "for Each" funktioniert auf dieser basis leider nicht.
procedure DisplayProgBarButtons();
var oButton: TClsButtonInfo; begin for oButton in goProgBar do Controls.DisplayButton(oButton); end; Meldung die ausgegeben wird. Zitat:
Delphi-Quellcode:
Mein Code in VB sieht so aus.
TClsProgBar = class(TComponent)
TClsButtonInfo = class(TComponent)
Code:
"For Each oButton In goProgBar" enumeriert die vorhandenen Button.
Private Sub DisplayProgBarButtons()
Dim oButton As clsButtonInfo For Each oButton In goProgBar frmButtons.DisplayButton oButton Next End Sub
Code:
Ich weis nun nicht wie ich das in Delphi umsetzen soll.
Public Property Get NewEnum() As IUnknown
'this property allows you to enumerate 'this collection with the For..Each syntax Set NewEnum = mcolButtons.[_NewEnum] End Property Hoffe mal das mir hier jemand weiterhelfen kann. gruss |
AW: For each in Delphi
Delphi-Quellcode:
Der Standard Enumerator liefert hier alle Components zurück, darum muss die Index-Variable auch vom Typ TComponent sein.
procedure DisplayProgBarButtons();
var oButton: TComponent; begin for oButton in goProgBar do if oButton is TClsButtonInfo then Controls.DisplayButton( TClsButtonInfo( oButton ) ); end; Ansonsten einen eigenen Enumerator schreiben (der sieht aber fast genauso aus) und lohnt nur, wenn du den öfter benötigst. |
AW: For each in Delphi
Danke dir...
Der Compiler meckert jetzt nicht mehr. Es wird aber auch kein Sprung in meine Procedure ausgeführt.
Delphi-Quellcode:
procedure TClsControls.DisplayButton(oButton: TClsButtonInfo);
Breakpoint in
Delphi-Quellcode:
for oButton in goProgBar do
Springt er rein. beim nächsten step wird mir in der zeile
Delphi-Quellcode:
Controls.DisplayButton(TClsButtonInfo(oButton));
lediglich der blaue Pfeil angezeigt aber ein sprung in meine Procedure findet nicht statt. Setze ich keinen Breakpoint wird das teil übersprungen. Es ist aber ein Button vorhanden. Ist es möglich das es daran liegt das meine Anwendung Nonvcl ist? Also keine Componenten in herkömmlichen Style verwendet werden? EDIT: oButton = Nicht verfügbarer wert. Siehe Pic2 gruss |
AW: For each in Delphi
Zitat:
Delphi-Quellcode:
procedure DisplayProgBarButtons();
var oButton: TComponent; info : string; begin for oButton in goProgBar do begin info := oButton.Name + ':' + oButton.Classname; // auf folgender Zeile einen breakpoint setzen und beobachten was in der Variablen "info" steht if oButton is TClsButtonInfo then Controls.DisplayButton( TClsButtonInfo( oButton ) ); end; end; |
AW: For each in Delphi
Der Sprung ist nicht wirklich in das
Delphi-Quellcode:
, sondern ins "implizite" Ende der Schleife (
Controls.DisplayButton(TClsButtonInfo(oButton));
Delphi-Quellcode:
) und da es kein End gibt, wird die Position halt in der Zeile des vorhergehenden Befehls angezeigt.
end;
Delphi-Quellcode:
Denn der Code für die For-Schleife befindet sich nicht nur am Anfang der Schleife, sondern auch teilweise danach.
for oButton in goProgBar do
begin if oButton is TClsButtonInfo then begin Controls.DisplayButton( TClsButtonInfo( oButton ) ); end; end; Zitat:
Wenn der Button über den FormDesigner erstellt und aus der DFM geladen wurde, dann ist sein Owner "immer" die Form. Die Beziehungen was wo dargestellt wird, werden aber über den Parent und nicht über den Owner geregelt. Will man was Anderes per For-In durchlaufen, dann braucht man einen anderen und eventuell selbst erstellten Enumerator. |
AW: For each in Delphi
Zitat:
Deshalb auch meine Frage im vorherigen Beitrag. Zitat:
Delphi-Quellcode:
Die Button werden in die TObjectList FColButtons gespeichert.
function TClsProgBar.AddButton(var oButton: TClsButtonInfo): Bool;
begin if ButtonExists(oButton.Num) then RemoveButton(oButton.Num); FColButtons.Add(oButton); FColButtons.Insert(oButton.Num, oButton); Result := True; end; Warum sollte dann hier kein Button existieren.. oder hab ich da nen DenkFehler? Zitat:
er springt nicht mal in die Bedingung wohlbemerk nach der änderung mit den begin..
Delphi-Quellcode:
if oButton is TClsButtonInfo then
er tickt zweimal die "for oButton" an und springt dann raus.
Delphi-Quellcode:
function Button(Btn: Integer): TClsButtonInfo;
Zitat:
Ich glaube das muss ich anders händeln.. So werden die Button erstellt.
Delphi-Quellcode:
gruss
procedure TClsControls.AddButton(hMain: HWND; Index: Integer);
begin btnButtons[Index] := CTRL_PushButtonCreate(hMain, (SKAERO_FOLDER + 'BTN_Push.png'), ' ', 11, 25, 40, 40, ID_BTN_BUTTON + Index, SKAERO_BTNTEXTCOLOR, 1, 5); SKAERO_SetAnchorMode(btnButtons[Index].Handle, ANCHOR_BOTTOM_RIGHT); SKAERO_SetZorder(btnButtons[Index].Handle, HWND_TOP); ShowWindow(btnButtons[Index].Handle, SW_HIDE); FButtonHandle := btnButtons[Index].Handle; end; |
AW: For each in Delphi
Der Knackpunkt liegt in dem Create-Aufruf für die Buttons. Das Create erwartet einen Owner als Parameter, in dessen Components-Liste sich der Button eintragen soll. Wenn du später mit for-each den goProghBar iterieren willst, musst du auch diesen als Owner beim Create übergeben (dann sollte auch der Code von Sir Rufo funktionieren).
Ohne genauere Informationen zu Klassendeklarationen, etwaige default Field-Props und Enumeratoren kann man allerdings wenig zur Lösung beitragen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 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