![]() |
AW: Problem bei case // Problem bei Komponenten löschen
Hmm, sorry, das ist alles etwas zu unübersichtlich.
Hast Du mal einen Haltepunkt gesetzt und hast das Programm Schritt für Schritt laufen lassen? Wenn Du dabei die Inhalte der Variablen einsiehst, solltest Du sehen, was passiert (und was vielleicht passieren solle). if A = A then ... Ist auf jeden Fall unsinnig. Diese Anweisung kann man sich immer sparen und lässt einen Schreibfehler vermuten... |
AW: Problem bei case // Problem bei Komponenten löschen
Delphi-Quellcode:
Er steppt alle Items durch und wenn eins gecheckt ist dann soll er iErstellteFrames eins hochzählen. So ist es ja richtig.
for ichecked := 0 to CheckListBox1.Items.Count-1 do
begin if CheckListBox1.Checked[ichecked] then iErstellteFrames := iErstellteFrames + 1; end; begin if iGecheckteFrames = iErstellteFrames then Dann durchläuft er die if/else Abfragen. Beim ersten mal ist der zaehler ja 0 daher springt er in:
Delphi-Quellcode:
durchläuft die Anweisungen und bei
if iZaehler = 0 then
begin Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; Frames.Top := iY; Frames.Parent := Formular; iZaehler := iZaehler + 1; iGecheckteframes := iGecheckteframes + 1; if iGecheckteFrames = iErstellteFrames then begin ShowMessage('Zwischenablage drucken und aktuelle Form drucken'); end;
Delphi-Quellcode:
springt er dann runter zu
if iGecheckteFrames = iErstellteFrames
Delphi-Quellcode:
also ich weiß da nicht mehr weiter -.-
...
end; Formular.Show; end; |
AW: Problem bei case // Problem bei Komponenten löschen
Du musst auf die Begin-End´s achten!
Delphi-Quellcode:
if x then
MacheWas; MacheDasNaechste;
Delphi-Quellcode:
Wenn Du die Blöcke und Anweisungen "schön" einrückst und IN RUHE untersuchst, solltest Du wohl eine falsche begin-end Anweisung finden.
if x then
begin MacheWas; MacheNochWas; end; MacheDasNaechste; In meinem Beispiel oben sieht man auf einen Blick, dass die erste if-Bedingung nur einen Befehl betrifft und die zweite einen Block. Ich denke, Du warst da in Deinem Code nur etwas zu schlampig. Ordner das mal und zeig es uns dann notfalls nochmal ... |
AW: Problem bei case // Problem bei Komponenten löschen
Hallo, ich habe mich dazu entschlossen, doch alles in case Blöcke einzubaun. Habe erstmal meine bisherigen Anweisungen einfach in die case Blöcke kopiert und sortier da jetzte aus was in allen gleich ist etc...
Delphi-Quellcode:
Statements, die in allen cases gleich sind, soll ich über
for ichecked := 0 to CheckListBox1.Items.Count-1 do
if CheckListBox1.Checked[ichecked] then case iZaehler of 10: begin for I := l.Count -1 downto 0 do begin Frames:= (L[i] as TFrame4); Frames.Free; end; ShowMessage('Formular in Zwischenablage kopieren + Formular leeren'); iZaehler := 0; iGecheckteFrames:= iGecheckteFrames + 1; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken + aktuelle Form leeren') end; end; 0: begin // --> Anweisungen Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; Frames.Top := iY; Frames.Parent := Formular; iZaehler := iZaehler + 1; iGecheckteframes := iGecheckteframes + 1; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken und aktuelle Form drucken'); end; end; 1..4: begin Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; Frames.Top := iY + Frames.ClientHeight; iY := Frames.Top; Frames.Parent := Formular; iZaehler := iZaehler + 1; iGecheckteFrames := iGecheckteFrames + 1; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end; 5: begin Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; Frames.Left := 350; Frames.Parent := Formular; iZaehler := iZaehler + 1; iGecheckteframes := iGecheckteframes + 1; end; 6..9: begin Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; Frames.Left := 350; Frames.Top := iRunter + Frames.ClientHeight; iRunter:= Frames.Top; Frames.Parent := Formular; iZaehler := iZaehler + 1; iGecheckteFrames := iGecheckteFrames + 1; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end; end; Formular.Show; end;
Delphi-Quellcode:
schreiben, da aber in keinem der 4 etwas gleich ist sonder nur in sondern nur für 3 schreibe ich jetzte über den ersten case Block noch eine und schreib da meine gleichen Statements rein, dann ist das ganze schon ein bisschen aufgeräumt? Was haltet ihr davon?
case iZaehler of
|
AW: Problem bei case // Problem bei Komponenten löschen
Hierfür kann man auch die IDE-Erweiterung cnPack verwenden. Diese markiert die Blöcke dann farbig
|
AW: Problem bei case // Problem bei Komponenten löschen
Delphi-Quellcode:
for ichecked := 0 to CheckListBox1.Items.Count-1 do
//begin ... so lange Folgeanweisungen würde ich der Übersichtlichkeit halber in ein begin...end kapseln. Ist zwar nicht notwendig, liest sich aber besser if CheckListBox1.Checked[ichecked] then // hier evtl. auch ein begin ... end nutzen, da dann eine sehr lange Anweisung folgt case iZaehler of // kann man auch schön einrücken: // 0..100: begin // ... // end; 10: begin for I := l.Count -1 downto 0 do begin Frames:= (L[i] as TFrame4); Frames.Free; end; ShowMessage('Formular in Zwischenablage kopieren + Formular leeren'); iZaehler := 0; iGecheckteFrames:= iGecheckteFrames + 1; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken + aktuelle Form leeren') end; end; 0: begin // --> Anweisungen Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; Frames.Top := iY; Frames.Parent := Formular; iZaehler := iZaehler + 1; iGecheckteframes := iGecheckteframes + 1; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken und aktuelle Form drucken'); end; end; 1..4: begin Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; Frames.Top := iY + Frames.ClientHeight; iY := Frames.Top; Frames.Parent := Formular; iZaehler := iZaehler + 1; iGecheckteFrames := iGecheckteFrames + 1; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end; 5: begin Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; Frames.Left := 350; Frames.Parent := Formular; iZaehler := iZaehler + 1; iGecheckteframes := iGecheckteframes + 1; end; 6..9: begin Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; Frames.Left := 350; Frames.Top := iRunter + Frames.ClientHeight; iRunter:= Frames.Top; Frames.Parent := Formular; iZaehler := iZaehler + 1; iGecheckteFrames := iGecheckteFrames + 1; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end; end; // 2 "end" auf gleicher Ebene? Das ist unübersichtlich... und könnte auf einen Fehler hinweisen. Formular.Show; end; |
AW: Problem bei case // Problem bei Komponenten löschen
und wieder mal ein langer Code:
Habe hier meine 2 Case Blöcke reingeschrieben. Bei 10: sind ja keine Übereinstimmunge mit den anderen. im case 0..9: hab ich eben reingeschrieben, was in anderen Blöcken gleich ist. Irgendwo ist da mal wieder ein kleiner Fehler drin, oder ich hab noch eine Line vergessen. Aber jetzte sollte es schon übersichtlicher sein (Einrückung).
Delphi-Quellcode:
for ichecked := 0 to CheckListBox1.Items.Count-1 do
if CheckListBox1.Checked[ichecked] then case iZaehler of 0..9: begin Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; iZaehler := iZaehler + 1; iGecheckteframes := iGecheckteframes + 1; Frames.Parent := Formular; end; end; case iZaehler of 10: begin for I := l.Count -1 downto 0 do begin Frames:= (L[i] as TFrame4); Frames.Free; end; ShowMessage('Formular in Zwischenablage kopieren + Formular leeren'); iZaehler := 0; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken + aktuelle Form leeren') end; end; 0: begin Frames.Top := iY; Frames.Parent := Formular; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken und aktuelle Form drucken'); end; end; 1..4: begin Frames.Top := iY + Frames.ClientHeight; iY := Frames.Top; Frames.Parent := Formular; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end; 5: begin Frames.ClientHeight := 200; Frames.Name:=''; Frames.Left := 350; end; 6..9: begin Frames.Left := 350; Frames.Top := iRunter + Frames.ClientHeight; iRunter:= Frames.Top; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end; end; Formular.Show; end; |
AW: Problem bei case // Problem bei Komponenten löschen
Deine if-Anweisung führt NUR DAS ERSTE CASE aus:
Delphi-Quellcode:
Also nochmal:
for ichecked := 0 to CheckListBox1.Items.Count-1 do
if CheckListBox1.Checked[ichecked] then // if bezieht sich auf die NÄCHSTE Anweisung (da Du keinen begin...end-Block benutzt) case iZaehler of 0..9: begin Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; iZaehler := iZaehler + 1; iGecheckteframes := iGecheckteframes + 1; Frames.Parent := Formular; end; end; // ab hier wird IMMER ausgeführt case iZaehler of 10: begin for I := l.Count -1 downto 0 do begin Rücke alles so ein, dass alle nachfolgenden (gleichrangigen) Anweisungen GENAU untereinander stehen. Das betrifft auch begin und end -> sollen genau untereinander stehen. alles zwischen begin und end wird um 2 Zeichen eingerückt. Dann hättest Du Dein o.g. Problem selbst gesehen! Das erste case kannst Du auch ersethen durch: if iZaehler < 10 then begin ... end da Du ja nicht unterschiedliche Fälle behandeln willst. Du machst Dir Deine Probleme selbst, da Du viel zu luschig arbeitest. 3 Min in eine ordentliche Quelltextstruktur inversieren kann 3 Stunden Fehlersuche sparen! |
AW: Problem bei case // Problem bei Komponenten löschen
Delphi-Quellcode:
So hoffe mal jetzte siehts alles bisschen übersichtlicher aus.
procedure TForm1.bitbtnDruckenClick(Sender: TObject);
var iChecked, iZaehler, iGecheckteFrames, iY, iRunter, iErstellteFrames, i: Integer; begin Formular:=TForm.Create(Self); Formular.ClientHeight := 1500; Formular.ClientWidth := 670; l:=TComponentList.Create; L.OwnsObjects:= False; iGecheckteFrames := 0; iErstellteFrames := 0; iY := 0; iRunter := 0; iZaehler := 0; for ichecked := 0 to CheckListBox1.Items.Count-1 do if CheckListBox1.Checked[ichecked] then begin case iZaehler of 0..9: begin Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; iZaehler := iZaehler + 1; iGecheckteframes := iGecheckteframes + 1; Frames.Parent := Formular; end; end; case iZaehler of 10: begin for I := l.Count -1 downto 0 do begin Frames:= (L[i] as TFrame4); Frames.Free; iZaehler := 0; end; begin if iGecheckteFrames = 13 then ShowMessage('Formular in Zwischenablage kopieren + Formular leeren'); end; end; 0: begin Frames.Top := iY; if iGecheckteFrames = 13 then ShowMessage('Zwischenablage drucken + aktuelle Form leeren'); end; 2..5: begin Frames.Top := iY + Frames.ClientHeight; iY := Frames.Top; Frames.Parent := Formular; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end; 6: begin Frames.ClientHeight := 200; Frames.Name:=''; Frames.Left := 350; end; 7..9: begin Frames.Left := 350; Frames.Top := iRunter + Frames.ClientHeight; iRunter:= Frames.Top; if iGecheckteFrames = 13 then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end; end; Formular.Show; end; end; |
AW: Problem bei case // Problem bei Komponenten löschen
nein, nicht wirklich:
Delphi-Quellcode:
Soweit mal ungetestet auf die Schnelle.
procedure TForm1.BitBtnDruckenClick(Sender: TObject);
var iChecked, iZaehler, iGecheckteFrames, iY, iRunter, iErstellteFrames, i: Integer; // hier schon einrücken begin Formular := TForm.Create(Self); // Leerzeichen Formular.ClientHeight := 1500; Formular.ClientWidth := 670; L := TComponentList.Create; // Leerzeichen + Groß/Kleinschreibung L.OwnsObjects := False; iGecheckteFrames := 0; iErstellteFrames := 0; iY := 0; iRunter := 0; iZaehler := 0; for iChecked := 0 to CheckListBox1.Items.Count - 1 do begin // Was soll in der Schleife laufen? Bis incl. Formular.Show? Dann wird das Formular Items.Count mal angezeigt. if CheckListBox1.Checked[iChecked] then begin // alles folgende wird bei Checked durchgeführt, Formular.Show aber immer if iZaehler < 10 then begin Frames := TFrame4.Create(Self); L.Add(Frames); Frames.ClientHeight := 200; Frames.Name:=''; iZaehler := iZaehler + 1; iGecheckteframes := iGecheckteframes + 1; Frames.Parent := Formular; end; //end; dieses End würde bedeuten dass die Checked-Bedingung nur bis hierher gelten würde case iZaehler of 10: begin for I := l.Count -1 downto 0 do begin Frames:= (L[i] as TFrame4); Frames.Free; iZaehler := 0; end; //begin <- unnötig if iGecheckteFrames = 13 then ShowMessage('Formular in Zwischenablage kopieren + Formular leeren'); //end; < unnötig end; 0: begin Frames.Top := iY; if iGecheckteFrames = 13 then ShowMessage('Zwischenablage drucken + aktuelle Form leeren'); end; 2..5: begin Frames.Top := iY + Frames.ClientHeight; iY := Frames.Top; Frames.Parent := Formular; if iGecheckteFrames = 13 then ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; 6: begin Frames.ClientHeight := 200; Frames.Name := ''; Frames.Left := 350; end; 7..9: begin Frames.Left := 350; Frames.Top := iRunter + Frames.ClientHeight; iRunter:= Frames.Top; if iGecheckteFrames = 13 then ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end; end; Formular.Show; end; end; Auf jeden Fall hat man jetzt die Chance, sich ungefähr zurecht zu finden. Die Leerzeichen und Groß/Klein-Schreibung ist vielleicht etwas Krümelkackerei, man sollte sich das aber gleich so angewöhnen, da man so viel schneller mögliche Tippfehler findet. Ich weiß aber ehrlich gesagt jetzt nicht genau, was Du genau erreichen willst bzw. wo etwas nun nicht wie erwartet klappt (Du hast da einfach schon zu viele Varianten beschrieben). Also nun nochmal: - ordne Deinen Quelltext - setze einen Breakpoint und arbeite den Quelltext schrittweise ab - stelle konkrete Fragen mit präziser Problembeschreibung (dann kommt man oft bei einer Problemformulierung schon selbst auf die Lösung - kannst Du mir glauben :wink:) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 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