AGB  ·  Datenschutz  ·  Impressum  







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

For each in Delphi

Ein Thema von EWeiss · begonnen am 25. Aug 2012 · letzter Beitrag vom 25. Aug 2012
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

For each in Delphi

  Alt 25. Aug 2012, 01:40
Das alte leidige Problem

Ich habe zwei Classen
TClsProgBar..TClsButtonInfo

Mein Anliegen ist zu erfahren wie viele Button sich in goProgBar befinden.
goProgBar: TClsProgBar;
Delphi-Quellcode:
procedure DisplayProgBarButtons();
var
  oButton: TClsButtonInfo;
begin

  for oButton in goProgBar do
    Controls.DisplayButton(oButton);

end;
Das Delphi Interne "for Each" funktioniert auf dieser basis leider nicht.
Meldung die ausgegeben wird.
Zitat:
[DCC Fehler] uMain.pas(147): E2010 Inkompatible Typen: 'TClsButtonInfo' und 'TComponent'
Delphi-Quellcode:
TClsProgBar = class(TComponent)
TClsButtonInfo = class(TComponent)
Mein Code in VB sieht so aus.
Code:
Private Sub DisplayProgBarButtons()
    Dim oButton As clsButtonInfo
   
    For Each oButton In goProgBar
        frmButtons.DisplayButton oButton
    Next
End Sub
"For Each oButton In goProgBar" enumeriert die vorhandenen Button.
Code:
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
Ich weis nun nicht wie ich das in Delphi umsetzen soll.
Hoffe mal das mir hier jemand weiterhelfen kann.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: For each in Delphi

  Alt 25. Aug 2012, 01:49
Delphi-Quellcode:
procedure DisplayProgBarButtons();
var
  oButton: TComponent;
begin

  for oButton in goProgBar do
    if oButton is TClsButtonInfo then
      Controls.DisplayButton( TClsButtonInfo( oButton ) );

end;
Der Standard Enumerator liefert hier alle Components zurück, darum muss die Index-Variable auch vom Typ TComponent sein.

Ansonsten einen eigenen Enumerator schreiben (der sieht aber fast genauso aus) und lohnt nur, wenn du den öfter benötigst.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: For each in Delphi

  Alt 25. Aug 2012, 02:01
Danke dir...
Der Compiler meckert jetzt nicht mehr.
Es wird aber auch kein Sprung in meine Procedure ausgeführt.

procedure TClsControls.DisplayButton(oButton: TClsButtonInfo);

Breakpoint in
for oButton in goProgBar do

Springt er rein.
beim nächsten step wird mir in der zeile

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

Geändert von EWeiss (11. Jul 2019 um 15:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: For each in Delphi

  Alt 25. Aug 2012, 03:23
lediglich der blaue Pfeil angezeigt aber ein sprung in meine Procedure findet nicht statt.
Setze ich keinen Breakpoint wird das teil übersprungen.
Dann ist halt kein Button der Klasse TClsButtonInfo in der Komponentenliste.
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: For each in Delphi

  Alt 25. Aug 2012, 03:26
Der Sprung ist nicht wirklich in das Controls.DisplayButton(TClsButtonInfo(oButton)); , sondern ins "implizite" Ende der Schleife (end; ) und da es kein End gibt, wird die Position halt in der Zeile des vorhergehenden Befehls angezeigt.

Delphi-Quellcode:
for oButton in goProgBar do
begin
  if oButton is TClsButtonInfo then
  begin
    Controls.DisplayButton( TClsButtonInfo( oButton ) );
  end;
end;
Denn der Code für die For-Schleife befindet sich nicht nur am Anfang der Schleife, sondern auch teilweise danach.

Zitat:
Dann ist halt kein Button der Klasse TClsButtonInfo in der Komponentenliste.
For-In bei einem TComponent durchläuft alle "Components", also die Ownerbeziehungen, da hierfür ein entsprechender "Enumerator" implementiert wurde.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Aug 2012 um 03:32 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: For each in Delphi

  Alt 25. Aug 2012, 04:58
Zitat:
Wenn der Button über den FormDesigner erstellt und aus der DFM geladen wurde, dann ist sein Owner "immer" die Form.
Nein es gibt keinen FormDesigner NonVcl.
Deshalb auch meine Frage im vorherigen Beitrag.

Zitat:
Ist es möglich das es daran liegt das meine Anwendung Nonvcl ist?
Also keine Componenten in herkömmlichen Style verwendet werden?

Delphi-Quellcode:
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;
Die Button werden in die TObjectList FColButtons gespeichert.
Warum sollte dann hier kein Button existieren.. oder hab ich da nen DenkFehler?

Zitat:
Denn der Code für die For-Schleife befindet sich nicht nur am Anfang der Schleife, sondern auch teilweise danach.


er springt nicht mal in die Bedingung wohlbemerk nach der änderung mit den begin..
if oButton is TClsButtonInfo then

er tickt zweimal die "for oButton" an und springt dann raus.
function Button(Btn: Integer): TClsButtonInfo;
Zitat:
Dann ist halt kein Button der Klasse TClsButtonInfo in der Komponentenliste.
Das ist meine vermutung da Nonvcl.
Ich glaube das muss ich anders händeln..

So werden die Button erstellt.
Delphi-Quellcode:
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;
gruss

Geändert von EWeiss (25. Aug 2012 um 05:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#7

AW: For each in Delphi

  Alt 25. Aug 2012, 12:43
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:31 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