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

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
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 3. Sep 2010, 11: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.358 Beiträge
 
Delphi 11 Alexandria
 
#2

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

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

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

  Alt 3. Sep 2010, 13: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.358 Beiträge
 
Delphi 11 Alexandria
 
#4

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

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

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

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

  Alt 3. Sep 2010, 15:02
Viele Vielen Dank.
Funktioniert zwar noch nicht so, wie ich mir es vorstelle, aber es nimmt Formen an.
Bisher habe ich nur getestet.
Mein eigentliches Ziel ist folgendes, ich lasse mir alle Mitarbeiter (Name, Vorname, Abteilung, Bild) in die CheckListBox schreiben. Von den gecheckten Items (Mitarbeitern) lasse ich mir anschließend Mitarbeiterausweise (Frames, auf dem Bild, Labels für Kontaktdaten, vermerkt sind) ausdrucken. Ist ja eigentlich schon "fast" fertig Die AdsQuery hab ich schon erstellt und den benötigten SQL geschrieben. Jetzte muss ich nur noch hinbekommen, dass er für jedes neu erstellte Frame, einen Datensatz weiterspringt, momentan wird nur ein und der selbe Mitarbeiter angezeigt.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

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

  Alt 3. Sep 2010, 15:08
Ok, alles klar

Der Weg ein Formuar anzuzeigen und auszudrucken, ist eigentlich nicht ganz optimal. Grundsätzlich kann man das besser über ein Report-Tool lösen, das also quasi ein Dokument mit Texten und Bildern erzeugt.

Aber mach das ruhig erst mal so fertig. Hauptsache, Du gehst die Sache strukturiert an. Dann wird das auch ...
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
 
#7

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

  Alt 3. Sep 2010, 23:42
das mit den Report-Tools ist mir bewusst (z.B. Crystal Reports) aber ist denk ich mal ne gute Aufgabe für einen Newbie
Angenehmen Abend noch.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19: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