Autor Beitrag
Alpha_Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Do 08.12.05 15:51 
Ersteinmal danke an alle =) hab von jedem ein bisschen was übernommen.. stand wohl wirklich aufm Schlauch.. danke für den Code Philipp!

Die Liste brauche ich deswegen da ich zuerst komplett den Tree zwischenspeichern möchte bevor ich ich weiterarbeite..

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Alpha_Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Do 08.12.05 17:11 
Hmm..mir ist grad wieder was aufgefallen was nicht funktioniert(wieder Problem mit der Übergabe eines Records..)

Ich habe den Code von opfer.der.genauigkeit genommen.
Das ganze baut darauf auf das ich vorher eine Liste fülle und sie dann an einen Rekord übergebe damit ich Value und IsChild auslesen kann:

Unit1
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
...

private
    fTreeListRecord: TTreeListRecord;

...

//******************************************************************************
function TForm1.InitChecklistPrintDlg(aTreeList: TdxTreeList): boolean;
var
  lNodeCount: integer;
  lItemCount: integer;
  lCounter: integer;
  lCounter2: integer;
  lValue: string;
  lNode: TdxTreeListNode;
begin
  result := false;
  lChecklistePrintProcessMgr := nil;
  try
    lChecklistePrintProcessMgr := TChecklistePrintProcessMgr.Create;
    // ParentCount der TreeList
    lNodeCount := aTreeList.Count;

    // Record wird gefüllt
    for lCounter := 0 to lNodeCount-1 do begin
      // Parents
      lNode := aTreeList.Items[lCounter];
      lValue := lNode.Values[0] + ' ' + lNode.Values[2];

      //New(fTreeListRecord);
      with fTreeListRecord do begin
        Value := lValue;
        IsChild := false;
      end;
      lChecklistePrintProcessMgr.AddToList(fTreeListRecord);

      // ItemCount der TreeList
      lItemCount := lNode.Count;

      // Childs
      for lCounter2 := 0 to lItemCount-1 do begin
        lValue := lNode.Items[lCounter2].Values[2];

        //New(fTreeListRecord);
        with fTreeListRecord do begin
          Value := lValue;
          IsChild := true;
        end;

        lChecklistePrintProcessMgr.AddToList(fTreeListRecord);
      end;
    end;

    result := true;
  except
    // Hier später Fehlerbehandlung
  end;
end;





Unit2
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
PTreeListRecord = ^TTreeListRecord;
  TTreeListRecord = record
    Value: string;
    IsChild: boolean;
  end;

  ...

  private
    TreeListRecord: ^TTreeListRecord;

  ...

//******************************************************************************
// Aufruf um den aktuellen Inhalt des Records in eine Liste zu speichern
function TChecklistePrintProcessMgr.AddToList(
  aTreeListRecord: TTreeListRecord): boolean;
begin
  result := false;
  try
    fTreeList.Add(@aTreeListRecord);
    result := true;
  except
    // Hier später Fehlerbehandlung 
  end;
end;

//******************************************************************************
// Hier wird versucht den Inhalt der Liste auszulesen und ihn wieder auf den
// Record aufzuteilen damit Value und IsChild getrennt ausgelesen werden können
function TChecklistePrintProcessMgr.PrepareData: boolean;
var
  lTreeListCount: integer;
begin
  Result := false;
  lTreeListCount := fTreeList.Count;

  for lCounter := 0 to lTreeListCount-1 do begin

    TreeListRecord := fTreeList.Items[lCounter];
    ShowMessage(TreeListRecord^.Value);
  end;


Der markierte Code ist nur ein Test.. allerdings funktioniert es nicht.. ich bekomme jedes mal wenn er die markierte Zeile erreicht folgende Fehlermeldung:

ausblenden Quelltext
1:
Im Projekt Project1.exe ist eine Exception der Klasse EExternalException aufgetreten. Meldung: 'Externe Exception 80000001'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.					


Danach gehts nicht mehr weiter. Ich weiss bei dieser Fehlermeldung leider nicht mehr weiter.. Bitte um Hilfe!

Dankeschön.

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Do 08.12.05 17:26 
Hi,

setzt mal bitte ein var hier ein oder übergib direkt den Zeiger:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
//******************************************************************************
// Aufruf um den aktuellen Inhalt des Records in eine Liste zu speichern
function TChecklistePrintProcessMgr.AddToList( [b]var[/b] aTreeListRecord: TTreeListRecord): boolean;
begin
  result := false;
  try
    fTreeList.Add(@aTreeListRecord);
    result := true;
  except
    // Hier später Fehlerbehandlung 
  end;
end;


Probier das mal oder mach es etwas schöner und übergib direkt den Zeiger:
ausblenden Delphi-Quelltext
1:
aTreeListRecord: PTreeListRecord					


//Edit: Zudem sei erwähnt, daß du in deinem Code immer den gleichen Record an deine Liste übergibst. (fTreeListRecord: TTreeListRecord == konstante adresse)

//Edit:
Beispiel:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
unit Unit1;

interface

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

type
  PTreeRec = ^TTreeRec;
  TTreeRec = record
    Idx: string;
  end;

  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormShow(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    fList: TList;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  lIdx: integer;
  lRec: PTreeRec;
begin
  fList := TList.Create;

  for lIdx := 0 to 100 do
  begin
    New( lRec );
    lRec^.Idx := IntToStr( lIdx );
    fList.Add( lRec )
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  lIdx: integer;
begin

  if Assigned( fList ) then
  begin
    for lIdx := 0 to (fList.Count - 1do
    begin
      Dispose( fList.Items[lIdx] );
    end;
    FreeAndNil( fList );
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
var
  lIdx: integer;
begin
  for lIdx := 0 to (fList.Count -1do
  begin
    Memo1.Lines.Add( PTreeRec(fList.Items[lIdx])^.Idx );
  end;
end;

end.

_________________
Stellen Sie sich bitte Zirkusmusik vor.
petergensfeld
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Windows Vista 32-Bit
Delphi XE Professional
BeitragVerfasst: Do 08.12.05 17:55 
Hier noch mein Vorschlag, ändere die Methode AddToList mal wie folgt ab:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
    
function TChecklistePrintProcessMgr.AddToList(
  aTreeListRecord: TTreeListRecord): Boolean;
var
  pNewRec: ^TTreeListRecord;
begin
  new(pNewRec);
  pNewRec^:=aTreeListRecord;
  try
    fTreeList.Add(pNewRec);
    Result:=true;
  except
    Result:=false;
  end;
end;

Dein Fehler: Du speicherst immer wieder die gleiche Referenz in der Liste ab.

Gruß Dirk
Alpha_Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Fr 09.12.05 10:04 
So, jetzt funktioniert alles.. :idea: vielen Dank euch allen :)

Das mit New() hatte ich ausversehen auskommentiert und dann gelöscht :oops:

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.