Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Problem bei case // Problem bei Komponenten löschen (https://www.delphipraxis.net/154244-problem-bei-case-problem-bei-komponenten-loeschen.html)

Metallicwar 2. Sep 2010 23:55

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

Satty67 3. Sep 2010 00:21

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:
       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
Da sieht man schon, dass zwischen den Blöchen vieles identisch ist.

Erster Schritt wäre, die Erzeugung und Wertzuordnung des Frames auszulagern:
Delphi-Quellcode:
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
Das Frame wird jetzt in CreateFrame angelegt und diese Funktion gibt das fertige Frame zurück für L.Add.

Dann kann man den Check, ob gedruck werden soll zusammenfassen. Da auf variablen der ButtonClick-Methode zugegriffen wird, innerhalb (IncAndPrintAt14):

Delphi-Quellcode:
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
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.

Metallicwar 3. Sep 2010 08:23

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

Metallicwar 3. Sep 2010 08:39

AW: Problem bei case // Problem bei Komponenten löschen
 
Zitat:

2) Ich würde einfach eine neue Variable definieren und die einzelnen Checkboxen durchzählen.
"CheckedCount" o.ä. gibt es m.E. leider nicht.
So hatte ich das vor:
Delphi-Quellcode:
   for ichecked := 0 to CheckListBox1.Items.Count-1 do
    iErstellteFrames := iErstellteFrames + 1;
    if CheckListBox1.Checked[ichecked] then
    begin
      if iErstellteFrames = iErstellteFrames then
Erhalte aber eine Exception:
Im Projekt.... der Klasse EListError mit der Meldung 'ListIndex überschreitet das Maximum (14)' aufgetreten.

mkinzler 3. Sep 2010 08:49

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:

Delphi-Quellcode:
      if iErstellteFrames = iErstellteFrames then

Sollte immer wahr sein

Metallicwar 3. Sep 2010 09:16

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:
  for ichecked := 0 to CheckListBox1.Items.Count-1 do
  begin
    iErstellteFrames := iErstellteFrames + 1;
  end;
    if CheckListBox1.Checked[ichecked] then
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.

mkinzler 3. Sep 2010 09:18

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

Metallicwar 3. Sep 2010 09:36

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

mkinzler 3. Sep 2010 09:39

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;

Metallicwar 3. Sep 2010 09:57

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:
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;
Was mach ich blos falsch? :O (Der Mittag rückt näher, da muss es fertig sein :o)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr.
Seite 2 von 4     12 34      

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