Danke für die Antworten! Das hilft mir schon einmal weiter.
Zitat:
Im Form erzeugst du dann kein TPanel sondern eben einen solchen Frame (Frame-
Unit in Uses aufnehmen) und platzierst ihn an die passende Stelle. Hier wäre eventuell ein TFlowPanel als Parent brauchbar, das sich automatisch um die fließende Anordnung kümmert. Das würde deinen Code sicher deutlich reduzieren.
Nur um zu überprüfen, ob ich das auch richtig verstanden habe: Was ich in Form einer Klasse umsetzen wollte, würde dann durch einen Frame ersetzt, indem ich das Layout festlege. Am Montag werde ich mir das mal anschauen, auch wenn ich wahrscheinlich bei meiner Klasse bleibe, allein deshalb, um das Erstellen von Klassen zu üben.
Zitat:
Um mal allgemein zu antworten. Globale Variablen wird man am ehesten los, wenn man mit Klassen arbeitet. Dort können die Werte mit Hilfe von privaten Feldern gut den einzelnen Methoden zu Verfügung gestellt werden. Im Konstruktor werden sie zu gewiesen/belegt und stehen dann den Methoden zur Verfügung.
Ok, das war auch eine meiner Ideen. Bleibt noch eine Sache: Am liebsten würde ich in meiner Klasse auch schon programmieren, was passieren soll, wenn ich z. B. auf eines der Panels klicke. In meinem Code sieht das bisher so aus:
Code:
procedure TfrmMain.SelectByClick(Sender: TObject);
var
obj : TPanel;
pnlIdx : Integer;
begin
obj := Sender as TPanel;
if GetKeyState(VK_Control) < 0 then // Strg pressed; enable multiselect
begin
if obj.Color = selectedPnlColor then obj.Color := defaultPnlColor
else obj.Color := selectedPnlColor;
end
else // Strg not pressed; disable multiselect
begin
for pnlIdx := 0 to Length(panelsArray) -1 do
begin
panelsArray[pnlIdx].Color := defaultPnlColor;
end;
obj.Color := selectedPnlColor;
end;
end;
Ähnlich wie im Explorer von Windows möchte ich, dass selektierte Panels blau (selectedPnlColor) werden. Wenn nun schon andere Panels selektiert sind, dann sollen diese Panels nach einem Klick wieder die Standardfarbe (defaultPnlColor) bekommen (falls STRG nicht gedrückt wird). Wie im Code oben zu sehen, greife ich hierzu auf panelsArray zu, das array of TPanel, das alle Panels in meiner Scrollbox enthält.
Wenn ich eine solche Prozedur in meiner Klasse implementieren möchte, dann brauche ich also in meiner Klasse schon ein array in Form einer Klassenvariablen. In diesem Fall hätte ich vmtl. kein Problem, die Prozedur zu implementieren. Aber das schränkt meine Klasse dafür stark ein. Ich kann in meinem Projekt ohne Weiteres nur eine Scrollbox mit Panels erzeugen. Ist es in meinem Fall sinnvoll, das array als Klassenvariable zu definieren oder gibt es noch andere Möglichkeiten, um die Prozedur im Code-Beispiel oben auch ohne Klassenvariable innerhalb meiner Klasse zu implementieren.
Vielleicht beantworte ich meine Frage jetzt schon selbst, aber als ich den Beitrag geschrieben habe, kam mir die Idee, meiner Klasse TIconPanel eine weitere Eigenschaft mitzugeben, z. B. ein Integer FGroupIndex. Dann könnte ich IconPanels, die zusammen gehören sollen, allen den gleichen Gruppen-Index verpassen und so aus allen Panels im array die heraussuchen, die einen bestimmen Wert bei FGroupIndex haben.
P.S.: Zusammenfassend kann man vllt. sagen, dass meine "Probleme" neben meiner fehlender Erfahrung auch daher kommen, dass ich mich nicht entscheiden kann, ob ich meine Klasse allgemein halten möchte oder spezieller machen möchte. Ist sie allgemein, dann kann ich die Klasse für viele verschiedene Anwendungen verwenden, dafür erledigt die Klasse wenig Arbeit für mich. Implementiere ich die Klasse hingegen eher spezieller, dann bin ich bei der Verwendung stärker eingeschänkt, aber dafür erledigt die Klasse schon fast alles für mich.