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 4. Sep 2010
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von stahli
stahli

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

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

  Alt 3. Sep 2010, 10:22
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...
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
 
#22

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

  Alt 3. Sep 2010, 10:54
Delphi-Quellcode:
  for ichecked := 0 to CheckListBox1.Items.Count-1 do
  begin
    if CheckListBox1.Checked[ichecked] then
    iErstellteFrames := iErstellteFrames + 1;
  end;
    begin
      if iGecheckteFrames = iErstellteFrames then
Er steppt alle Items durch und wenn eins gecheckt ist dann soll er iErstellteFrames eins hochzählen. So ist es ja richtig.

Dann durchläuft er die if/else Abfragen. Beim ersten mal ist der zaehler ja 0 daher springt er in:
Delphi-Quellcode:
          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;
durchläuft die Anweisungen und bei if iGecheckteFrames = iErstellteFrames springt er dann runter zu
Delphi-Quellcode:
    ...
end;
  Formular.Show;
end;
also ich weiß da nicht mehr weiter -.-
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

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

  Alt 3. Sep 2010, 11:13
Du musst auf die Begin-End´s achten!

Delphi-Quellcode:
if x then
  MacheWas;
MacheDasNaechste;
Delphi-Quellcode:
if x then
begin
  MacheWas;
  MacheNochWas;
end;
MacheDasNaechste;
Wenn Du die Blöcke und Anweisungen "schön" einrückst und IN RUHE untersuchst, solltest Du wohl eine falsche begin-end Anweisung finden.

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 ...
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
 
#24

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

  Alt 3. Sep 2010, 12: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 12:22 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

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

  Alt 3. Sep 2010, 12: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.343 Beiträge
 
Delphi 11 Alexandria
 
#26

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

  Alt 3. Sep 2010, 12: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
Metallicwar

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

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

  Alt 3. Sep 2010, 12:51
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;
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

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

  Alt 3. Sep 2010, 13:02
Deine if-Anweisung führt NUR DAS ERSTE CASE aus:

Delphi-Quellcode:
  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
Also nochmal:
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!
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
 
#29

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

  Alt 3. Sep 2010, 14:27
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
    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;
So hoffe mal jetzte siehts alles bisschen übersichtlicher aus.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

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

  Alt 3. Sep 2010, 14:51
nein, nicht wirklich:

Delphi-Quellcode:
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;
Soweit mal ungetestet auf die Schnelle.
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 )
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 18:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz