Einzelnen Beitrag anzeigen

Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#12

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

  Alt 3. Sep 2010, 00:21
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.
  Mit Zitat antworten Zitat