Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Checkbox (https://www.delphipraxis.net/89770-checkbox.html)

stOrM 5. Apr 2007 13:20


Checkbox
 
Hallo, ich hab hoffentlich ein simples Problem, eventuell hatte jemand mal etwas ähnliches und kann mir hier einen Tip geben...

Problem ist folgendes:
Ich hab vor mir ein kleines Tools zu schreiben welches eine Art Installations Menu (komplett grafisch) darstellt.

Ich möchte für die Auswahl der zu installierenden Programme Checkboxen verwenden.
Das Problem dabei ist, ich benutze in der GUI keine Tab/PageControls oder ähnliches, jetzt frage ich mich, wenn die GUI automatisch mit Checkboxen gefüllt wird (z.B. Programme Ordner auslesen und pro Programm eine Checkbox auf die GUI) wie kann ich ein blättern (vor/zurück) erreichen, weil wenn es sehr viele Programme sind wird logischerweise Irgendwann die GUI voll sein so das ich vor/zurückblättern muss...

Eigentlich bräuchte ich in etwa so etwas:
IniFile = Programme die zur verfügung stehen + Beschreibung zu den Programmen.
Rubriken wie z.B. System, Antivirus usw.

Routine zum einlesen des IniFiles + dynamische Checkbox Erstellung.
Blätter Funktion, die durch die Sektionen der Ini wandern kann muss dann wieder dynamisch die Checkboxen auf die GUI basteln.

Ansonsten wenn jemand eine simplerer Idee hat bin offen für alles, nur kann ich eben keine Standart Komponenten benutzen da wie gesagt die Oberfläche ist kompl. geskinnt, ich möchte daherauch keine 3rd Komponenten zum Skinnen einsetzen die womöglich noch Geld kosten oder ähnliches!

Ich danke schonmal im vorraus!
s!

Nuclear-Ping 5. Apr 2007 13:24

Re: Checkbox
 
Warum verwendest du denn kein Tab-/PageControl bzw. Notebook? Anders wirst du das glaube nicht so leicht realisiert bekommen.

Edit: Ok, hab überlesen, dass du eine geskinnte Form hast.
Edit2: TNotebook (in der Palette unter Win 3.1 zu finden) könnte vlt. doch nützlich sein. Schau's dir mal an.

Luckie 5. Apr 2007 13:40

Re: Checkbox
 
Nimm einen Listview mit Checkboxen.

stOrM 5. Apr 2007 13:42

Re: Checkbox
 
Zitat:

Zitat von Nuclear-Ping
Warum verwendest du denn kein Tab-/PageControl bzw. Notebook? Anders wirst du das glaube nicht so leicht realisiert bekommen.

Edit: Ok, hab überlesen, dass du eine geskinnte Form hast.
Edit2: TNotebook (in der Palette unter Win 3.1 zu finden) könnte vlt. doch nützlich sein. Schau's dir mal an.

Hi,
Geskinnt halt, richtig.
Zu Edit2 nützt mir ja leider nichts, da ich nicht eine neue Komponente schreiben will um die Komplett transparent zu haben.

Lucky, kann ich leider vergessen, da meine Checkboxen ebenfalls geskinnt sind, die ListView leider net.

Luckie 5. Apr 2007 13:45

Re: Checkbox
 
Der Listview wird doch bestimmt von der Komponente auch geskinnt oder? Wo ist das Problem?

stOrM 5. Apr 2007 13:48

Re: Checkbox
 
Zitat:

Zitat von Luckie
Der Listview wird doch bestimmt von der Komponente auch geskinnt oder? Wo ist das Problem?

Jo Luckie das ist genau das Problem sie wird eben nicht geskinnt leider!
Ich hatte mir gedacht, daß man das in etwa machen kann wie M$ so eine Art Menu wie beim Setup von XP oder so, da gibt es ja auch ein Menu nur eben nicht mit Checkboxen dafür die grünen [->] Buttons mit MouseOver/Leave

Nuclear-Ping 5. Apr 2007 14:01

Re: Checkbox
 
Eine neue Komponente schreiben musst du nicht. "Nur" TNotebook umbiegen und selber zeichnen. ;)
Heisst eine neue Komponente erstellen und die von TNotebook ableiten.
Den OnPaint- / OnDraw-Event publizieren und dort drin halt "einfach" das Zeichnen, was hinter dem Notebook liegt. Google mal nach Transparent Panel oder such hier im Forum. Gab da schonmal so was, was halt einfach das auf sich selber gezeichnet hat, was dahinter lag.

stOrM 5. Apr 2007 14:06

Re: Checkbox
 
Zitat:

Zitat von Nuclear-Ping
Eine neue Komponente schreiben musst du nicht. "Nur" TNotebook umbiegen und selber zeichnen. ;)
Heisst eine neue Komponente erstellen und die von TNotebook ableiten.
Den OnPaint- / OnDraw-Event publizieren und dort drin halt "einfach" das Zeichnen, was hinter dem Notebook liegt. Google mal nach Transparent Panel oder such hier im Forum. Gab da schonmal so was, was halt einfach das auf sich selber gezeichnet hat, was dahinter lag.

Hmmm, dafür fehlt mir die Zeit im Moment, das ganze muss schnell fertig werden.
Aber nochmal zurück zu den Checkboxen, vielleicht weisst du folgendes:

Wie kann man auf einen Schlag sagen wir mal 30/40 Checkboxen auf die GUI klatschen und dafür sorgen, das sie wenigstens mittig sitzen und nicht über die GUI hinausragen?

Etwa:

------------------------------
[x] [x] usw...
[x] [x]
[x] [x]
[x] [x]
------------------------------

Nuclear-Ping 5. Apr 2007 14:14

Re: Checkbox
 
Delphi-Quellcode:
// Absichtlich dynamisches Array
var
  myCheckboxes: Array of TCheckbox;
  a: Integer;
begin
  SetLength (myCheckboxes, 30);
  for a := 0 to Length (myCheckboxes) - 1 do
    begin
      myCheckboxes[a] := TCheckbox.Create (Self);
      with myCheckboxes[a] do
        begin
          Parent := Self;
          Name := 'Checkbox' + inttostr (a + 1);
          Caption := 'Checkbox ' + inttostr (a + 1);
          Width := 100;
          Left := 8; // ggf anpassen falls du Spalten machen willst
          Top := (a + 1) * 8;
        end;
    end;

end;
Sollte klappen. Nicht vergessen, die dann auch wieder freizugeben wenn du sie nicht mehr brauchst (Programmende).

stOrM 5. Apr 2007 14:19

Re: Checkbox
 
Zitat:

Zitat von Nuclear-Ping
Delphi-Quellcode:
// Absichtlich dynamisches Array
var
  myCheckboxes: Array of TCheckbox;
  a: Integer;
begin
  SetLength (myCheckboxes, 30);
  for a := 0 to Length (myCheckboxes) - 1 do
    begin
      myCheckboxes[a] := TCheckbox.Create (Self);
      with myCheckboxes[a] do
        begin
          Parent := Self;
          Name := 'Checkbox' + inttostr (a + 1);
          Caption := 'Checkbox ' + inttostr (a + 1);
          Width := 100;
          Left := 8; // ggf anpassen falls du Spalten machen willst
          Top := (a + 1) * 8;
        end;
    end;

end;
Sollte klappen. Nicht vergessen, die dann auch wieder freizugeben wenn du sie nicht mehr brauchst (Programmende).

Das ging schnell!
Vielen Dank, Spalten? könnte sein mal sehen wie ich die [x] Plaziere...

DGL-luke 5. Apr 2007 14:20

Re: Checkbox
 
Und hier n bisschen generischer:

Delphi-Quellcode:
procedure MakeCheckBoxes(Container: TWinControl; Captions: TStrings; CBOnClick: TNotifyEvent = nil);
var i: Integer;
    Size: TSize;
    buf: string;
begin
  for i := 0 to Captions.Count-1 do
  with TCheckBox.Create(Container) do
  begin
    Parent := Container;
    Top := i * 16; //reicht 16?
    Left := 3;
    Height := 16;
    buf := Captions[i];
    GetTextExtentPoint32(Canvas.Handle, @buf[1], Length(buf),Size);
    Width := Size.cx + 16; //16 extra für die Box
    Tag := i;
    Caption := buf;
    OnClick := CBOnClick;
  end;
end;
So kannst du Checkboxes "hinklatschen". Wie viel reinpassen würd ich per Container.Height div 16 berechnen.

EDIT: So, korrekte Size dazu.

stOrM 5. Apr 2007 14:44

Re: Checkbox
 
Zitat:

Zitat von DGL-luke
Und hier n bisschen generischer:

Delphi-Quellcode:
procedure MakeCheckBoxes(Container: TWinControl; Captions: TStrings; CBOnClick: TNotifyEvent = nil);
var i: Integer;
    Size: TSize;
    buf: string;
begin
  for i := 0 to Captions.Count-1 do
  with TCheckBox.Create(Container) do
  begin
    Parent := Container;
    Top := i * 16; //reicht 16?
    Left := 3;
    Height := 16;
    buf := Captions[i];
    GetTextExtentPoint32(Canvas.Handle, @buf[1], Length(buf),Size);
    Width := Size.cx + 16; //16 extra für die Box
    Tag := i;
    Caption := buf;
    OnClick := CBOnClick;
  end;
end;
So kannst du Checkboxes "hinklatschen". Wie viel reinpassen würd ich per Container.Height div 16 berechnen.

EDIT: So, korrekte Size dazu.

Perfekt! SupervielenDank

Nuclear-Ping 5. Apr 2007 15:40

Re: Checkbox
 
Ich würde die Checkboxes in ein Array werfen. Das erleichtert den Zugriff später darauf ungemein. Sonst frickelst du für 40 Checkboxen mit "FindComponent" rum, was im Geschwindigkeitsvergleich zum Array um einiges lahmer ist.

stOrM 5. Apr 2007 16:20

Re: Checkbox
 
Zitat:

Zitat von Nuclear-Ping
Ich würde die Checkboxes in ein Array werfen. Das erleichtert den Zugriff später darauf ungemein. Sonst frickelst du für 40 Checkboxen mit "FindComponent" rum, was im Geschwindigkeitsvergleich zum Array um einiges lahmer ist.

Hmmmmm...
Also doch Version 1 hier nehmen?

Nuclear-Ping 5. Apr 2007 17:39

Re: Checkbox
 
1 + 2 kombinieren. ;)

DGL-luke 5. Apr 2007 17:44

Re: Checkbox
 
Jo. is wohl sinnvoller:

Delphi-Quellcode:
function MakeCheckBoxes(Container: TWinControl; Captions: TStrings; CBOnClick: TNotifyEvent = nil): TObjectList;
var i: Integer;
    Size: TSize;
    buf: string;
begin
  Result := TObjectList.Create;
  for i := 0 to Captions.Count-1 do
  with Result[Result.Add(TCheckBox.Create(Container))] as TCheckBox do //sorry dafür. aber da mach ich jetzt kein extra faß variablen für auf.
  begin
    Parent := Container;
    Top := i * 16; //reicht 16?
    Left := 3;
    Height := 16;
    buf := Captions[i];
    GetTextExtentPoint32(Canvas.Handle, @buf[1], Length(buf),Size);
    Width := Size.cx + 16; //16 extra für die Box
    Tag := i;
    Caption := buf;
    OnClick := CBOnClick;
  end;
end;

Nuclear-Ping 5. Apr 2007 17:47

Re: Checkbox
 
Zitat:

//sorry dafür. aber da mach ich jetzt kein extra faß variablen für auf.
Zwingt dich ja auch keiner. :P Wollte ihn das eigentlich selber lösen lassen, deswegen hab ich keinen Code dazugepackt.

Aber das mit TObjectList ist 'ne gute Idee, hab ich nicht dran gedacht. Noch 'n Tick sauberer als Array. :thumb:

DGL-luke 5. Apr 2007 17:55

Re: Checkbox
 
Hast recht, aber ich glaube, ohne viel Erfahrung kommt man nicht auf eine Lösung, die so sauber und elegant ist wie meine (riecht ihrs auch? - nich dass die nicht auch Probleme aufwerfen würde, neue Instanzen aus einer Funktion zu liefern ist nicht ganz unproblematisch, die muss man nämlich wieder freigeben). :)

Nuclear-Ping 5. Apr 2007 22:39

Re: Checkbox
 
:love: :mrgreen:

Flocke 6. Apr 2007 12:59

Re: Checkbox
 
Zitat:

Zitat von DGL-luke
die muss man nämlich wieder freigeben

Ganz kleiner Dämpfer: nicht, wenn sie von TComponent abgeleitet sind und einen Owner haben - der kümmert sich dann nämlich um alles. Schlimmer noch: wenn du die TObjectList nach dem Owner freigeben würdest, dann hagelte es Exceptions ;)

Hawkeye219 6. Apr 2007 13:18

Re: Checkbox
 
Zitat:

Zitat von Flocke
Ganz kleiner Dämpfer: nicht, wenn sie von TComponent abgeleitet sind und einen Owner haben

Auch wenn sie keinen Owner besitzen, kann es Probleme geben. Die CheckBoxen liegen ja normalerweise auf einem TWinControl, und diese Controls entsorgen bei ihrer Freigabe alle enthaltenen Controls. Abhilfe schafft die Verwendung einer Delphi-Referenz durchsuchenTComponentList. Diese Liste wird über die Freigabe von Controls informiert und entfernt dann die betroffenen Referenzen.

Gruß Hawkeye

CodeX 21. Apr 2007 08:46

Re: Checkbox
 
Zitat:

Zitat von DGL-luke
Jo. is wohl sinnvoller:

Delphi-Quellcode:
function MakeCheckBoxes(Container: TWinControl; Captions: TStrings; CBOnClick: TNotifyEvent = nil): TObjectList;
var i: Integer;
    Size: TSize;
    buf: string;
begin
  Result := TObjectList.Create;
  for i := 0 to Captions.Count-1 do
  with Result[Result.Add(TCheckBox.Create(Container))] as TCheckBox do //sorry dafür. aber da mach ich jetzt kein extra faß variablen für auf.
  begin
    Parent := Container;
    Top := i * 16; //reicht 16?
    Left := 3;
    Height := 16;
    buf := Captions[i];
    GetTextExtentPoint32(Canvas.Handle, @buf[1], Length(buf),Size);
    Width := Size.cx + 16; //16 extra für die Box
    Tag := i;
    Caption := buf;
    OnClick := CBOnClick;
  end;
end;

Kannst Du bitte ein Anwendungsbeispiel dafür geben? Ich bekomme das nämlich nicht zum Laufen.
Konkret möchte ich in die dritte und vierte Spalte eine Checkbox ohne Beschriftung setzen.

Woran es hapert:
1. Canvas wird als undeklariert angezeigt. Ich habe deshalb "Canvas : TCanvas;" bei var von MakeCheckBoxes aufgenommen. Ist das so korrekt oder soll das wo anders herkommen?
2. Ich komme mit den Parametern nicht ganz zurecht. Als Container muss ich ja die entsprechende ListView angeben, oder? Ich welcher Weise werden aber die Captions benötigt/verwendet?

Bei meinen Versuchen wurde bestenfalls eine External Exception ausgegeben und dann eine Checkbox im ersten Column Header angezeigt ... :?

Ich wäre für Hilfe sehr dankbar. :)

DGL-luke 21. Apr 2007 10:44

Re: Checkbox
 
Hallo,

sorry, das sollte natürlich Container.Canvas heißen.

Und wenn du eh mit einer Listview arbeitest... die hat doch Checkboxes schon eingebaut?! Einfach die Eigenschaft CheckBoxes aktivieren...

CodeX 21. Apr 2007 11:23

Re: Checkbox
 
Zitat:

Zitat von DGL-luke
sorry, das sollte natürlich Container.Canvas heißen.

das hatte ich probiert und gerade wider. das hilft nicht.

Zitat:

Zitat von DGL-luke
Und wenn du eh mit einer Listview arbeitest... die hat doch Checkboxes schon eingebaut?! Einfach die Eigenschaft CheckBoxes aktivieren...

dann hab ich die aber genau in der ersten spalte und nur da. ich brauche die aber wie gesagt in zwei anderen spalten.

DGL-luke 21. Apr 2007 12:09

Re: Checkbox
 
ok. bei mir hat die listview einen Canvas. aber wenn du eh keinen text brauchst, kann man viel einfach weglassen:

Delphi-Quellcode:
function MakeBlankCheckBoxes(Container: TWinControl; Number: Cardinal; CBOnClick: TNotifyEvent = nil): TObjectList;
var i: Integer;
begin
  Result := TObjectList.Create;
  for i := 0 to number-1 do
  with Result[Result.Add(TCheckBox.Create(Container))] as TCheckBox do //sorry dafür. aber da mach ich jetzt kein extra faß variablen für auf.
  begin
    Parent := Container;
    Top := i * 16; //reicht 16?
    Left := 3; //das anpassen
    Height := 16;  
    Width := 16; //16 extra für die Box
    Tag := i;
    Caption := '';
    OnClick := CBOnClick;
  end;
end;
Du wirst aber vermutlich das Problem haben, dass die CheckBoxes nicht von alleine mitscrollen.

CodeX 21. Apr 2007 12:41

Re: Checkbox
 
Zitat:

Zitat von DGL-luke
Du wirst aber vermutlich das Problem haben, dass die CheckBoxes nicht von alleine mitscrollen.

richtig :(
kann man diese nicht statt an listview an ein listviewitem anhängen? die position des listview ändert sich beim scrollen nicht, aber ja vielleicht die des listview items.

tut mir leid fürs nachfragen. ich kann das problem leider nicht alleine lösen, weil mir hierfür das spezialwissen fehlt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 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