![]() |
Problem mit Code, seit Komponente zur Laufzeit erstellt werd
Hallo,
vielleicht wisst ihr ja wo der Fehler ist :) Seit dem ich mein Checkboxarray zur Laufzeit erstellen lasse, funktioniert folgender Code nur noch halb!Also wenn ich die Checkbox anhake wird meine Caption nach wie vor rot aber nicht mehr fett geschrieben!! :gruebel: Vor der dynamischen Erstellung hat beides funktioniert!?! Danke schonmal im Voraus!
Delphi-Quellcode:
[b]//[/b]Checkbox BracketOpen
Setlength(BracketOpen, zaehler+1); BracketOpen[zaehler]:= TCheckBox.Create(self); BracketOpen[zaehler].Name:= 'CBBracketOpen'+InttoStr(zaehler+1); BracketOpen[zaehler].Parent:= GroupBoxesItem[zaehler]; BracketOpen[zaehler].Left:= 0; BracketOpen[zaehler].Top:= -4; BracketOpen[zaehler].Width:=30; BracketOpen[zaehler].Height:=22; BracketOpen[zaehler].Caption:='('; BracketOpen[zaehler].Font.Bold:=false; BracketOpen[zaehler].OnChange:=@CheckboxSettingsChange;
Delphi-Quellcode:
procedure TForm1.CheckBoxSettingsChange(Sender: TObject);
var i:Integer; begin i:=0; while i < High(BracketOpen) do begin if BracketOpen[i] = Sender then Break; inc(i); end; if BracketOpen[i] = Sender then begin if (BracketOpen[i].Checked=true) then begin BracketOpen[i].Font.Color:=clRed; BracketOpen[i].Font.Bold:=true; end else if (BracketOpen[i].Checked=false)then begin BracketOpen[i].Font.Color:=clBlack; BracketOpen[i].Font.Bold:=false; end; end; |
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Hi,
umschließ deinen Code mal mit den [.delphi] [./delphi] Tags (ohne die Punkte). Das macht das ganze lesbarer. Was mir im ersten Moment mal aufgefallen ist, ist folgendes:
Delphi-Quellcode:
Es müsste
BracketOpen[zaehler].OnChange:=@CheckboxSettingsChange;
Delphi-Quellcode:
heißen.
BracketOpen[zaehler].OnChange:=CheckboxSettingsChange;
|
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Hi,
sorry mir is gar nicht aufgefallen, dass beim Einfügen meines Codes, meine gesamte Einrückung weg gefallen ist.... Ich schreibe in Lazarus und da funktioniert der Funktionsaufruf leider nur, wenn ich das @ voran stelle.Somit ist dies leider nicht der Fehler. :( |
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Nicht das Problem, aber du solltest
Delphi-Quellcode:
statt
if BracketOpen[i].Checked then
Delphi-Quellcode:
schreiben, den diese Eigenschaft ist ja schon ein Boolean.
if (BracketOpen[i].Checked=true) then
Zudem ist die 2. if-Anweisung überflüssig ( die im else-Zweig), denn wenn eine Booleaneigenschaft nicht true ist ist sie false |
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Mal abgesehen von den Schönheitsfehlern des Codes die dir bereits beschrieben wurden -
was passiert, wenn du die Zeilen vertauschst, in denen du Farbe und Fett setzt - also erst Bold auf den gewünschten Wert setzt und dann die Farbe. Verändert sich das verhalten Deines Programms in Richtung nur noch Fett / nicht Fett oder bleibt es wie es ist -> rot / nicht rot Gruß, Chris |
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Delphi-Quellcode:
if BracketOpen[i] = (Sender as TCheckBox) then
|
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Zitat:
|
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Delphi-Quellcode:
wenn du .Name sonst nirgend's verwendet, kanst du auch Voreingestellten verwenden (hast dann kein Problem mit eventuellen doppelten Namen)
//Checkbox BracketOpen
Setlength(BracketOpen, zaehler + 1); BracketOpen[zaehler] := TCheckBox.Create(self); BracketOpen[zaehler].Parent := GroupBoxesItem[zaehler]; BracketOpen[zaehler].Left := 0; BracketOpen[zaehler].Top := -4; BracketOpen[zaehler].Width := 30; BracketOpen[zaehler].Height := 22; BracketOpen[zaehler].Caption := '('; BracketOpen[zaehler].Font.Bold := false; BracketOpen[zaehler].OnChange := CheckboxSettingsChange; Procedure TForm1.CheckBoxSettingsChange(Sender: TObject); Var i: Integer; Begin If Sender is TCheckBox Then If TCheckBox(Sender).Checked Then Begin TCheckBox(Sender).Font.Color := clRed; TCheckBox(Sender).Font.Bold := True; End Else Begin TCheckBox(Sender).Font.Color := clBlack; TCheckBox(Sender).Font.Bold := False; End; End; Das mit GroupBoxesItem[zaehler] ist richtig so? (jedem GroupBoxesItem ein BracketOpen?)
Delphi-Quellcode:
wenn du schon auf True prüfst, brauchst'e nicht nochmal auf False prüfen (wenn es nicht True war, "kann" es nu noch False sein ... zumindestens wenn du richtig prüfst, was heißt, prüfe NIEMALS auf True ... da gibt's hier genug Threads, wo die Erkläung drinsteht, warum nicht.)
if x=true then begin ... end else if x=false then begin ... end; // falsch
if x then begin ... end else if not x then begin ... end; // richtig if x then begin ... end else begin ... end; // besser verwendest du die Variable BracketOpen noch sonst irgendwo? (wenn nicht, dann könnte man diese auch weglassen) [edit] TCheckBox und nicht TCheckCox :oops: |
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Zitat:
|
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Zitat:
|
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Erbsenzählerei. ;)
|
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Nein OOP :mrgreen:
|
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
du meinst so zur Sicherheit, falls er da mal was Anderes macht,
Code:
damit wohl die folgenden Casts nicht plötzlich meckern. :angel2:
BracketOpen[zaehler]:= [b]TCheckBox[/b].Create(self);
Delphi-Quellcode:
if (Sender is TCheckBox) and (BracketOpen[i] = Sender) then
// hier man muß auch überall Kürzen if BracketOpen[i] = (Sender as TCheckBox) then ...........| |
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Hallo,
eventuell geht's ja so:
Delphi-Quellcode:
procedure TForm1.CheckBoxSettingsChange(Sender: TObject);
var i:Integer; begin i:=0; while i < High(BracketOpen) do begin if BracketOpen[i] = Sender then Break; inc(i); end; if BracketOpen[i] = Sender then begin if (BracketOpen[i].Checked) then begin BracketOpen[i].Font.Color:=clRed; BracketOpen[i].Font.Bold:=true; end else begin BracketOpen[i].Font.Color:=clBlack; BracketOpen[i].Font.Bold:=false; end; // Die beiden Zeilen können alternativ genutzt werden, // es ist nur eine erforderlich, welche ist Geschmacksache. BracketOpen[i].Refresh; // <- Neu zeichnen lassen BracketOpen[i].Repaint; // <- Neu zeichnen lassen end; end; |
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Die Schleife vorweg kannst Du Dir auch ersparen.
Ich würde es so schreiben...
Delphi-Quellcode:
procedure TForm1.CheckBoxSettingsChange(Sender: TObject);
begin with Sender as TCheckbox do begin Font.Bold:=checked; if checked then Font.Color:=clRed else Font.Color:=clBlack; Refresh; end; end; |
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Hallo,
erstmal VIELEN DANK für die vielen Antworten!!! :thumb: Ok, dass euch meine Schleife verwirrt ist gut möglich, da ihr den Rest von meinem Code nicht kennt :) sie aber schon ihren Sinn hat ;)... Habe sämtliche Möglichkeiten, die ihr mir alle gegeben habt ausprobiert, aber nach wie vor wird es zwar rot aber immernoch nicht fett! Naja vielleicht werde ich einfach auf das fett verzichten! Liebe Grüsse! |
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Hallo,
habe kein Lazarus/FreePascal. Bei Delphi geht das so:
Delphi-Quellcode:
Gibt es die Möglichkeit bei Dir eventuell auch?
CheckBox.Font.Style := fsBold;
|
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Zitat:
Delphi-Quellcode:
CheckBox.Font.Style := [fsBold];
|
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Hi,
ja diese Möglichkeit gibt es bei Lazarus auch, aber auch diese funktioniert nicht :( Grüsse |
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Ich habe mal versucht das zu reproduzieren, bei mir klappt folgendes allerdings wunderbar:
man nehme ein neues Projekt, ziehe eine CheckBox auf das Formular, erstelle eine OnClick-Methode dafür. Ins OnCreate kommt
Delphi-Quellcode:
Dadurch wird eine zweite CheckBox zur Laufzeit erstellt. Ins OnClick kommt:
procedure TForm1.FormCreate(Sender: TObject);
begin with TCheckBox.Create(self) do begin SetBounds(200,10,100,20); Parent:=self; Caption := 'Dynamisch'; OnClick:=@CheckBox1Click; end; end;
Delphi-Quellcode:
Klickt man jetzt auf eine der CheckBoxen, wird dessen Caption Rot und Fett dargestellt. Klappt also wunderbar :gruebel:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin with Sender as TCheckBox do begin Font.Color:=clRed; Font.Bold:=true; end; end; Klappt dieses Minibeispiel bei dir auch? |
Re: Problem mit Code, seit Komponente zur Laufzeit erstellt
Hallo inherited,
so funktioniert es bei mir auch, aber wieder integriert in meinem Programm wird es nach wie vor nicht bold!... :gruebel: aber danke! :hi: werde es ohne bold darstellen! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 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-2025 by Thomas Breitkreuz