![]() |
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! |
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. |
Re: Checkbox
Nimm einen Listview mit Checkboxen.
|
Re: Checkbox
Zitat:
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. |
Re: Checkbox
Der Listview wird doch bestimmt von der Komponente auch geskinnt oder? Wo ist das Problem?
|
Re: Checkbox
Zitat:
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 |
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. |
Re: Checkbox
Zitat:
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] ------------------------------ |
Re: Checkbox
Delphi-Quellcode:
Sollte klappen. Nicht vergessen, die dann auch wieder freizugeben wenn du sie nicht mehr brauchst (Programmende).
// 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; |
Re: Checkbox
Zitat:
Vielen Dank, Spalten? könnte sein mal sehen wie ich die [x] Plaziere... |
Re: Checkbox
Und hier n bisschen generischer:
Delphi-Quellcode:
So kannst du Checkboxes "hinklatschen". Wie viel reinpassen würd ich per Container.Height div 16 berechnen.
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; EDIT: So, korrekte Size dazu. |
Re: Checkbox
Zitat:
|
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.
|
Re: Checkbox
Zitat:
Also doch Version 1 hier nehmen? |
Re: Checkbox
1 + 2 kombinieren. ;)
|
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; |
Re: Checkbox
Zitat:
Aber das mit TObjectList ist 'ne gute Idee, hab ich nicht dran gedacht. Noch 'n Tick sauberer als Array. :thumb: |
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). :)
|
Re: Checkbox
:love: :mrgreen:
|
Re: Checkbox
Zitat:
|
Re: Checkbox
Zitat:
![]() Gruß Hawkeye |
Re: Checkbox
Zitat:
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. :) |
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... |
Re: Checkbox
Zitat:
Zitat:
|
Re: Checkbox
ok. bei mir hat die listview einen Canvas. aber wenn du eh keinen text brauchst, kann man viel einfach weglassen:
Delphi-Quellcode:
Du wirst aber vermutlich das Problem haben, dass die CheckBoxes nicht von alleine mitscrollen.
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; |
Re: Checkbox
Zitat:
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 12:55 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