![]() |
Array of TPanel sortieren
Hallo ..
irgendwie schaff ich es nicht ein "array of TPanel" zu erstellen - dieses mit bestehenden TPanels vom Fenster zu verbinden - und das Array nach "top" (also die position des panels) mit aufsteigendem Wert zu sortieren. Die "procedure TMainForm.erstelle_panel_array;" füllt mein Array 200 mal immer mit ein und demselben TPanel .. ich hab auf einer Form zur Designtime sagen wir mal 200 TPanels. in der private declaration habe ich nun ein "temp_panels-array" zum einlesen und das "meine_panel-Array" als Endziel:
Delphi-Quellcode:
in "form on create" habe ich
private
meine_panels: Array [0 .. 200] of TPanels; temp_panels: Array [0 .. 200] of TPanels; meine_panels_anzahl: Integer; temp_panels_anzahl: Integer;
Delphi-Quellcode:
for i := 0 to 200 do
begin meine_panels[i] := TPanels.Create(self); temp_panels[i] := TPanels.Create(self); end; und nun die .. Zuweisung ins Array ( die händisch erstellten Tpanels auf dem Fenster ins "temp_panels-array"): Mein Procedure "procedure TMainForm.erstelle_panel_array;"
Delphi-Quellcode:
meine_panels_anzahl := 0; temp_panels_anzahl := 0; for i := 0 to ComponentCount - 1 do begin If Components[i].ClassName = 'TPanel' then begin if TPanel(Components[i]).Tag <> 0 then // nur TPanels verwenden wo Tag-Wert gesetzt ist begin temp_panels[temp_panels_anzahl] := (Components[i] as TPanel); temp_panels_anzahl := temp_panels_anzahl + 1; end; end; end; // Dann die Anzahl setzen meine_panels_anzahl := temp_panels_anzahl - 1; // oder Pred(temp_panels_anzahl ) niedrigster_wert := 10000; grenzwert := 0; // Dann eine Schleife so oft durchgehen wie es Panels gibt for x := 0 to meine_panels_anzahl do // Anzahl der Panels durchlaufen begin Memo1.Lines.Append('Schleife x hat:'+inttostr(x)); // In der Schleife die ganzen Panels durchlaufen und den Niedrigsten Wert finden. for i := 0 to meine_panels_anzahl do // Alle Temp-Panels checken und niedrigsten wert finden begin aktuell_gelesen := temp_panels[i].Top; // memo1.Lines.Append('Analysiere '+temp_panels[i].Name); WENN ICH DAS AUSKOMMENTIERE GIBT EINEN FEHLER!! if (aktuell_gelesen < niedrigster_wert) AND (aktuell_gelesen > grenzwert) then begin niedrigster_wert := aktuell_gelesen; end; end; // i grenzwert := niedrigster_wert; for i := 0 to meine_panels_anzahl do // Alle Temp-Panels checken und niedrigsten wert finden begin if temp_panels[i].Top = niedrigster_wert then begin meine_panels[x] := temp_panels[i]; end; end; // i end; // x .. ich finde eigentlich die Ursache nicht, wieso das nicht funktionieren sollte :oops: Danke für Hinweise Erich |
AW: Array of TPanel sortieren
Delphi-Quellcode:
If Components[i].ClassName = 'TPanel' then
lieber:
Delphi-Quellcode:
If Components[i] is TPanel then
Delphi-Quellcode:
if TPanel(Components[i]).Tag <> 0 then // nur TPanels verwenden wo Tag-Wert gesetzt ist
Und wo wird Tag gesetzt? |
AW: Array of TPanel sortieren
@Delphi.Narium .. "tag" wird zur Designtime gesetzte
ABER es hat sich erledigt .... hab den Fehler jetzt endlich gefunden: Die Zeile:
Delphi-Quellcode:
muss in die Schleife rein:
niedrigster_wert := 10000;
Delphi-Quellcode:
dann funktionierts
for x := 0 to meine_panels_anzahl do // Anzahl der Panels durchlaufen
begin !!!!!!!!! niedrigster_wert := 10000; Sorry für das obrige Posting Erich |
AW: Array of TPanel sortieren
Wo wird denn das Top für die Panels gesetzt?
|
AW: Array of TPanel sortieren
Passt du denn "niedrigster_wert" nochmal an?
Ansonsten schreibt er dir immer den gleichen Wert für jedes x in meine_panels[x].
Delphi-Quellcode:
for i := 0 to meine_panels_anzahl do
begin if temp_panels[i].Top = niedrigster_wert then // Wenn das immer gleich bleibt, dann kommt auch immer das gleiche temp_panels[i] bei rum begin meine_panels[x] := temp_panels[i]; end; end; |
AW: Array of TPanel sortieren
Und was passiert mit diesen 402 Panels?
Delphi-Quellcode:
aus dem "form on create"?
for i := 0 to 200 do
begin meine_panels[i] := TPanels.Create(self); temp_panels[i] := TPanels.Create(self); end; Im späteren Quelltext weist Du doch jedem Element der Arrays (höchstwahrscheinlich) eins der zur Designzeit erstellten Panels zu. Irgendwie verstehe ich den Zusammenhang nicht. Momentan sieht es für mich so aus, als wären da einfach mal 402 "vagabundierende" Panels im Arbeitsspeicher. |
AW: Array of TPanel sortieren
@Delphi.Narium ... es geht um ein responsive-Design-Ding ... ich erstelle zur designtime einfach panels (mit all ihren funktionen) ... und zur laufzeit werden die positionen der panels anhand des Endgerätes optimal am Bildschirm verteilt...
@Uwe Raabe ... Der "tag"-Wert wird bei den panels auf dem TForm zur Designtime gesetzt.. @TiGü ... Genau das war der Fehler :-) Jetzt hab ich nur noch ein kleines Problem ;-) Hab gerade einen Effekt gemerkt: Wenn 2 Panels zur Designtime auf der gleichen "top"-position sind , werden alle beide via "If Components[i].ClassName = 'TPanel'" zwar gefunden .... aber in der nachfolgenden schleife wird nur ein Panel gefunden und zugeweisen .. das 2 (oder mehrere auf der gleichen top-position) gehen verloren ..
Delphi-Quellcode:
for i := 0 to meine_panels_anzahl do // Alle Temp-Panels checken und niedrigsten wert finden
begin if temp_panels[i].Top = niedrigster_wert then begin meine_panels[x] := temp_panels[i]; end; Solange alle Panels in der Designtime unterschiedliche Top-Positionen haben - funktionierts :-) |
AW: Array of TPanel sortieren
Hier ist definitiv was falsch!
Delphi-Quellcode:
Die erzeugten temp_panels sind mit Sicherheit nicht gewollt.
for i := 0 to 200 do
begin meine_panels[i] := TPanels.Create(self); temp_panels[i] := TPanels.Create(self); end; |
AW: Array of TPanel sortieren
Hallo Uwe ..
hab die Zeilen komplett gelöscht ... und es funktioniert immer noch ;-) Ich hab auch die Zeilen im "Form.OnClose" gelöscht ..
Delphi-Quellcode:
for i := 0 to 200 do
begin meine_panels[i] := TPanels.free; temp_panels[i] := TPanels.free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:53 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 by Thomas Breitkreuz