![]() |
AW: Problem bei case // Problem bei Komponenten löschen
mhhm, dann melde ich mich doch nochmal: :D :D :D
Zu Punkt 1: Ich habe 12 Items gecheckt er steppt durch bei zaehler = 10 löschen und die Eigenschaftswerte von Frames zurücksetzen. Dann weiter in der For Schleife. So beim elften gecheckten Item funktionierts einbandfrei, so wie es sein muss. Beim 12 Item durchläuft er aber komischerweise nicht mehr die if/else Anweisung sondern springt sofort aufs Ende --> Formular.Show; Ich verstehs nicht -.- *Augen werden schwer* :o |
AW: Problem bei case // Problem bei Komponenten löschen
Eine Antwort habe ich nicht, denke für einige andere ist der Code auch schwer auf einen Blick zu durchschauen...
Sowas kann man vermeiden, wenn man sich nicht wiederholt. Wenn es für den moment nicht klar wird, einfach später mal drüber nachenken und erst auf die eigentliche Aufgabe konzentrieren. Also Du wiederholst sehr viel Code. Wenn Du eine Änderung probieren wilslt, musst du das an vielen Stellen machen und etwas gedeht ist das ganze ja auch. Achtung! Alles Freihand, also nicht getestet ob es exakt so auch funktioniert! Beispiel-Abschnitt:
Delphi-Quellcode:
Da sieht man schon, dass zwischen den Blöchen vieles identisch ist.
else
begin 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 = 14 then begin ShowMessage('Zwischenablage drucken und aktuelle Form drucken'); end; end else begin if iZaehler <= 4 then 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 = 14 then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end Erster Schritt wäre, die Erzeugung und Wertzuordnung des Frames auszulagern:
Delphi-Quellcode:
Das Frame wird jetzt in CreateFrame angelegt und diese Funktion gibt das fertige Frame zurück für L.Add.
function TForm1.CreateFrame(Parent : TForm; aName : String; aHeight, aTop : Integer): TFrame4;
begin Result := TFrame4.Create(Self); Result.ClientHeight := Height; Result.Name:= aName; Result.Top := aTop; Result.Parent := Parent; end; // Der Block ist jetzt etwas geschrumpft else begin if iZaehler = 0 then begin L.Add(CreateFrame(Formular, '', 200, iY); iZaehler := iZaehler + 1; iGecheckteframes := iGecheckteframes + 1; if iGecheckteFrames = 14 then begin ShowMessage('Zwischenablage drucken und aktuelle Form drucken'); end; end else begin if iZaehler <= 4 then begin L.Add(CreateFrame(Formular, '', 200, iY + Frames.ClientHeight); iY := iY + Frames.ClientHeight; iZaehler := iZaehler + 1; iGecheckteFrames := iGecheckteFrames + 1; if iGecheckteFrames = 14 then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end else Dann kann man den Check, ob gedruck werden soll zusammenfassen. Da auf variablen der ButtonClick-Methode zugegriffen wird, innerhalb (IncAndPrintAt14):
Delphi-Quellcode:
Die beiden anderen Blöcke sind nicht ganz so identisch, aber ähnlich genug um die auch einzubinden bzw. jeweils für sich so zu schrumpfen.
function TForm1.CreateFrame(Parent : TForm; aName : String; aHeight, aTop : Integer): TFrame4;
begin Result := TFrame4.Create(Self); Result.ClientHeight := Height; Result.Name:= aName; Result.Top := aTop; Result.Parent := Parent; end; procedure TForm1.Button1Click(Sender: TObject); var iChecked, iZaehler, iGecheckteFrames, iY, iRunter, iErstellteFrames, i: Integer; procedure IncAndPrintAt(printAt : Integer); begin iZaehler := iZaehler + 1; iGecheckteframes := iGecheckteframes + 1; if iGecheckteFrames = printAt then begin ShowMessage('Zwischenablage drucken und aktuelle Form drucken'); end; end; begin Formular:=TForm.Create(Self); Formular.ClientHeight := 1500; // Der Block ist jetzt erheblich geschrumpft else begin if iZaehler = 0 then begin L.Add(CreateFrame(Formular, '', 200, iY); IncAndPrintAt(14); end else begin if iZaehler <= 4 then begin L.Add(CreateFrame(Formular, '', 200, iY + Frames.ClientHeight); iY := iY + Frames.ClientHeight; IncAndPrintAt(14); end else |
AW: Problem bei case // Problem bei Komponenten löschen
Morgen zusammen,
danke erstmal für die ausführliche Erklärung. Werde meinen Code bei Gelegenheit auch übersichtlicher coden. Vorerst werde ich mich aber mit meinen bestehenden Problemen beschäftigen und über Tipps und Hinweise freu ich mich natürlich :) Einen schönen Tag |
AW: Problem bei case // Problem bei Komponenten löschen
Zitat:
Delphi-Quellcode:
Erhalte aber eine Exception:
for ichecked := 0 to CheckListBox1.Items.Count-1 do
iErstellteFrames := iErstellteFrames + 1; if CheckListBox1.Checked[ichecked] then begin if iErstellteFrames = iErstellteFrames then Im Projekt.... der Klasse EListError mit der Meldung 'ListIndex überschreitet das Maximum (14)' aufgetreten. |
AW: Problem bei case // Problem bei Komponenten löschen
Füge mal ein Begin ein, so dass alles, was in der Schleife ausgeführt werden soll auch in ihr ausgeführt wird
Delphi-Quellcode:
for ichecked := Low( CheckListBox1.Items) to High( CheckListBox1.Items) do
begin Inc(iErstellteFrames); Zitat:
|
AW: Problem bei case // Problem bei Komponenten löschen
mhhhm.. an was es liegt, wieso es nicht geht weiß ich nur wie ich`s behebe. :)
Delphi-Quellcode:
Er geht erst alle Items durch, die gecheckt sind und erhört iErstellteFrames um 1. Dann springt er wieder in die if Abfrage und er gibt mir wieder die Exception aus.
for ichecked := 0 to CheckListBox1.Items.Count-1 do
begin iErstellteFrames := iErstellteFrames + 1; end; if CheckListBox1.Checked[ichecked] then |
AW: Problem bei case // Problem bei Komponenten löschen
Das end ist auch zu früh, deshalb sagte ich ja, alles was in die Schleife gehört
|
AW: Problem bei case // Problem bei Komponenten löschen
:pale: :pale:
Ich blick nicht mehr wirklich durch in dem Code. ^^ Finde aber nicht die richtige Stelle für das end. Mal kommt die Exception, dann erstellt er mir nur das erste Frame^^. Hoffe mal ich bekomm das heute noch alles hin. Und am Wochenende wirds dann Zeit den Code umzustellen. Also greift mir noch ein bisschen unter die Arme^^ mfg |
AW: Problem bei case // Problem bei Komponenten löschen
Delphi-Quellcode:
for ichecked := Low( CheckListBox1.Items) to High( CheckListBox1.Items) do
begin Inc(iErstellteFrames); if CheckListBox1.Checked[ichecked] then begin if iErstellteFrames = iErstellteFrames then begin ... end; end; end; |
AW: Problem bei case // Problem bei Komponenten löschen
Hatte es so auch schonmal, da lief es aber leider nicht so wie ich wollte.
Delphi-Quellcode:
Was mach ich blos falsch? :O (Der Mittag rückt näher, da muss es fertig sein :o)
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 begin Inc(iErstellteFrames); if CheckListBox1.Checked[ichecked] then begin if iGecheckteFrames = iErstellteFrames then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end else begin if iZaehler = 10 then 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 = iErstellteFrames then begin ShowMessage('Zwischenablage drucken + aktuelle Form leeren') end; end else begin 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; end else begin if iZaehler <= 4 then 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 = iErstellteFrames then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end else begin if iZaehler = 5 then 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 else 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 = iErstellteFrames then begin ShowMessage('Zwischenablage drucken + aktuelle Form drucken'); end; end; end; end; end; end; end; Formular.Show; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 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