AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Problem bei case // Problem bei Komponenten löschen
Thema durchsuchen
Ansicht
Themen-Optionen

Problem bei case // Problem bei Komponenten löschen

Ein Thema von Metallicwar · begonnen am 2. Sep 2010 · letzter Beitrag vom 3. Sep 2010
Antwort Antwort
Seite 1 von 2  1 2      
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#1

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

  Alt 2. Sep 2010, 21:38
2 Fragen habe ich bisher noch (könnte noch mehr werden):
Nehmen wir an, es sind 13 Items gecheckt, dann steppt er durch bis zaehler = 10 ist, dann druckt er die Form (muss ich noch einbaun) und löscht die Frames vom Formular. Dann steppt er weiter durch und erstellt wieder neue Frames, die aber sobald das Formular angezeigt wird nicht erscheinen (sollten ja 3 Stück zu sehen sein, ich seh aber keines.)

Anderes kleines Problemchen: Ich habe ja iGecheckteFrames = 14. Die 14 soll eben durch die Gesamtzahl der gecheckte Items ersetzt werden. Ich habe versucht mit iGecheckteFrames = CheckListBox1.Checked[ichecked] --> Inkompatible Typen.

mfg
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 2. Sep 2010, 22:25
1) Ich denke, Du musst IY nach dem ersten Druck auf 0 zurücksetzen.

2) Ich würde einfach eine neue Variable definieren und die einzelnen Checkboxen durchzählen.
"CheckedCount" o.ä. gibt es m.E. leider nicht.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#3

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

  Alt 2. Sep 2010, 22:36
Punkt 1 sollte ich heute noch hinbekommen
Punkt 2 werd ich mich morgen auf Arbeit drum kümmern.

Hoffe mal, du bist morgen früh/ vormittag auch anwesend, für evtl. auftretende Fragen
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#4

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

  Alt 2. Sep 2010, 22:55
mhhm, dann melde ich mich doch nochmal:
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*
  Mit Zitat antworten Zitat
Satty67

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

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

  Alt 2. Sep 2010, 23: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
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#6

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

  Alt 3. Sep 2010, 07:23
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
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#7

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

  Alt 3. Sep 2010, 07:39
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.
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#8

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

  Alt 3. Sep 2010, 11:16
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:
  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;
Statements, die in allen cases gleich sind, soll ich über case iZaehler of 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?

Geändert von Metallicwar ( 3. Sep 2010 um 11:22 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.880 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 3. Sep 2010, 11:24
Hierfür kann man auch die IDE-Erweiterung cnPack verwenden. Diese markiert die Blöcke dann farbig
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 3. Sep 2010, 11:33
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;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 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