Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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 17:16

Problem bei case // Problem bei Komponenten löschen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Erstmal mein aktueller Code, der allerdings durchaus unübersichtlich ist :)
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CheckLst, Unit4;

type
  TForm1 = class(TForm)
    CheckListBox1: TCheckListBox;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Formular: TForm;
  Frames: TFrame4;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
iChecked, iZaehler, iGecheckteFrames, iY, iRunter, iErstellteFrames: Integer;
begin
  Formular:=TForm.Create(Self);
  Formular.ClientHeight := 1500;
  Formular.ClientWidth := 670;
  iGecheckteFrames := 0;
  iY := 0;
  iRunter := 0;
  iZaehler := 0;
  for ichecked := 0 to CheckListBox1.Items.Count-1 do
    if CheckListBox1.Checked[ichecked] then
      if iGecheckteFrames = 14 then
      begin
        ShowMessage('Zwischenablage drucken + aktuelle Form drucken');
      end
      else
      begin
        if iZaehler = 10 then
        begin
          ShowMessage('Formular in Zwischenablage kopieren + Formular leeren');
          iZaehler := 0;
          iGecheckteFrames:= iGecheckteFrames + 1;
          if iGecheckteFrames = 14  then
          begin
            ShowMessage('Zwischenablage drucken + aktuelle Form leeren')
          end;
        end
        else
        begin
          if iZaehler = 0 then
          begin
            Frames := TFrame4.Create(Self);
            Frames.Name := CheckListBox1.Items[ichecked];
            Frames.ClientHeight := 200;
            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);
              Frames.Name := CheckListBox1.Items[ichecked];
              Frames.ClientHeight := 200;
              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
            else
            begin
              if iZaehler = 5 then
              begin
                Frames := TFrame4.Create(Self);
                Frames.Name := CheckListBox1.Items[ichecked];
                Frames.ClientHeight := 200;
                Frames.Left := 350;
                Frames.Parent := Formular;
                iZaehler := iZaehler + 1;
                iGecheckteframes := iGecheckteframes + 1;
              end
              else
              begin
                Frames := TFrame4.Create(Self);
                Frames.Name := CheckListBox1.Items[ichecked];
                Frames.ClientHeight := 200;
                Frames.Left := 350;
                Frames.Top := iRunter + Frames.ClientHeight;
                iRunter:= Frames.Top;
                Frames.Parent := Formular;
                iZaehler := iZaehler + 1;
                iGecheckteFrames := iGecheckteFrames + 1;
              if iGecheckteFrames = 14 then
                begin
                  ShowMessage('Zwischenablage drucken + aktuelle Form drucken');
                end;
              end;
            end;
          end;
        end;
      end;
Formular.Show;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckListBox1.Items.Add('a1');
CheckListBox1.Items.Add('a2');
CheckListBox1.Items.Add('a3');
CheckListBox1.Items.Add('a4');
CheckListBox1.Items.Add('a5');
CheckListBox1.Items.Add('a6');
CheckListBox1.Items.Add('a7');
CheckListBox1.Items.Add('a8');
CheckListBox1.Items.Add('a9');
CheckListBox1.Items.Add('a10');
CheckListBox1.Items.Add('a11');
CheckListBox1.Items.Add('a12');
CheckListBox1.Items.Add('a13');
CheckListBox1.Items.Add('a14');
end;

end.
1. Problem:
Habe erfahren, dass es durch case Blöcke übersichtlicher machbar wäre.
Hab das mal ausprobiert, bin aber der Vermutung, dass das so nicht möglich ist, da anscheinend keine <= , <, etc. möglich sind:
Delphi-Quellcode:
        iGecheckteFrames:= iGecheckteFrames + 1;
        //iZaehler:= iZaehler +
        case iZaehler of
          10:
          begin
          // --> Anweisungen
          end;
          0:
          begin
          // --> Anweisungen
          end;
          <=4:
          begin
          // --> Anweisungen
          end;
          5:
          begin
          // --> Anweisungen
          end;
          >5<=9:
          begin
          // --> Anweisungen
          end;
        end;

2. Problem:
Wenn 10 Frames auf dem Formular platziert worden sind, soll er das Formular drücken und anschließend alle Frames vom Formular löschen. Dann soll er weiter die Schleife durchlaufen, und die weiteren Frames auf dem Formular erzeugen... usw.
Hatte es vor mit Frames.Destroy bzw. DestroyComponents. Hat da jemand eine Idee?

dadurch entsteht auch mein 3. Problem:
Wenn ich mir z.B. 5 Items anchecke und auf den Button klicke. Anschließend klicke ich erneut auf den Button und erhalte logischerweise eine Exception. Siehe Anhang.

Wäre cool, wenn ihr mir bei den Problemen helfen könntet, muss das bis Freitag Mittag fertig haben :)

stahli 2. Sep 2010 17:39

AW: Problem bei case // Problem bei Komponenten löschen
 
1) Case
Man kann z.B. "1..4" oder "1, 3, 5" nutzen.

2) alle freigeben
Du kannst Deine Frames z.B. in eine TObjektList schreiben und nachher alle Frames in der Liste freigeben.

3) Componentennamen
Den Namen kannst Du einfach leer lassen, wenn Du die Frames zur Laufzeit erzeugst und diese nicht über den Namen ansprichst...

4) Freitag Mittag
das wird knapp ;-)

Metallicwar 2. Sep 2010 19:39

AW: Problem bei case // Problem bei Komponenten löschen
 
danke für die schnelle Antwort, werd mich gleich mal dran setzen :)
mach mir doch lieber Mut :D
so viel sieht des doch garnicht aus :) dankt den Tipps sollte ich das heute noch hinbekommen und morgen dann noch die Feinheiten :)

Metallicwar 2. Sep 2010 20:04

AW: Problem bei case // Problem bei Komponenten löschen
 
also das mit dem case werd ich erstmal weglassen, wenn Zeit werd ich das morgen noch ändern, kümmere mich jetzte erstmal um die Sache mit den Komponenten löschen & dem Beheben der Exception :) P.S.: Stellt euch auf Fragen ein :P

Metallicwar 2. Sep 2010 20:32

AW: Problem bei case // Problem bei Komponenten löschen
 
also das mit der TObjectList scheint für einen Anfänger doch nicht leicht zu sein ^^
http://www.delphibasics.co.uk/RTL.asp?Name=TList
Hab da mal gekuckt und auch nachgestellt, aber der meckert mir schon ganz oben rum dass "=" fehlt... etc. :)
Zum Problem mit der Exception: Vorher hatte ich ja drinne stehn Frames.Name := CheckListBox1.Items[i]
wenn ich diese line entferne, meckert er mir sofort nach Programmstart, dass es bereits ein Object mit dem Namen Frame4 gibt.
Ahhhh, das Problem mit der Exception habe behoben können Frames.Name := ''; :)
dann besteht also vorerst nur noch das Problem mit der ObjectListe.

stahli 2. Sep 2010 20:46

AW: Problem bei case // Problem bei Komponenten löschen
 
so zur Anregung:

Delphi-Quellcode:
var
  L: TComponentList;
...
    L := TComponentList.Create;
    L.OwnsObjects := False;
...
    L.Add(NewFrame);
...
    for I := L.Count - 1 downto 0 do
    begin
      AFrame := (L[I] as TFrame);
      AFrame.Free;
    end;

Metallicwar 2. Sep 2010 21:04

AW: Problem bei case // Problem bei Komponenten löschen
 
super, hat geklappt. Danke.
Hier nochmal der Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(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;
  iY := 0;
  iRunter := 0;
  iZaehler := 0;
  for ichecked := 0 to CheckListBox1.Items.Count-1 do
    if CheckListBox1.Checked[ichecked] then
    begin
      if iGecheckteFrames = 14 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 = 14  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 = 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
            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 = 14 then
                begin
                  ShowMessage('Zwischenablage drucken + aktuelle Form drucken');
                end;
              end;
            end;
          end;
        end;
      end;
    end;
    Formular.Show;
end;
Werde jetzte das Programm erneut durchgehn und weitere Fehler, etc. suchen :) Davon werden mit Sicherheit noch welche vorhanden sein. Falls ich nicht weiter komme, werd ich mich hier melden :)

Metallicwar 2. Sep 2010 21:38

AW: Problem bei case // Problem bei Komponenten löschen
 
2 Fragen habe ich bisher noch :D (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

stahli 2. Sep 2010 22:25

AW: Problem bei case // Problem bei Komponenten löschen
 
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.

Metallicwar 2. Sep 2010 22:36

AW: Problem bei case // Problem bei Komponenten löschen
 
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 :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 Uhr.
Seite 1 von 4  1 23     Letzte »    

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