Autor Beitrag
wolke
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 240



BeitragVerfasst: Mi 31.08.05 22:42 
ich habe anhand meines vorwissens und der anleitungen hier im forum eine verkettete liste erstellt mit einem eigenen record als datentyp. speichern will ich unter anderem unicode-codierte WideStrings, nur habe ich probleme mit der umsetzung - mit strings und integer-werten klappt das alles auch einwandfrei, nur bei widestrings ist mir der speicherbedarf unklar bzw. weiss ich mal wieder nicht, wie ich diese in den record stecken soll.

ich habe versucht, der Add-prozedur (quellcode siehe oben) statt SizeOf(TListItem) noch die länge der Widestrings zu übergeben, aber irgendwie klappt das so nicht.

wenn man den ganzen tag dran sitzt sieht man irgendwann auch nichts mehr, kann mir jemand mal wieder weiterhelfen?
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 31.08.05 23:00 
poste doch erstmal was du hast, wie dein rcord aussieht und wie du im moment speicherst

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
wolke Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 240



BeitragVerfasst: Do 01.09.05 16:00 
danke, ich habe mich ein wenig eingelesen und gegoogled und mir folgendes zusammengebastelt. scheint alles zu funktionieren, fastMM4 meckert auch nicht wegen speicherlecks, aber vielleicht hat ja von euch noch jemand einen kommentar, bin mir nicht sicher ob das wirklich alles "sauber" ist.

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:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
unit Unit1;

interface

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

type
  TFileListEntry = class
    private
      wFrom, wTo: widestring;
      action: integer;
    public
      property fFrom: WideString
         read wFrom;
      property fTo: WideString
         read wTo;
      property fAction: Integer
         read action;

      constructor Create(const aFrom, aTo: widestring; const aAction: integer);
  end;

  TFileList = class(TList)
  protected
    function GetObject(Index: Integer): TObject;
    procedure SetObject(Index: Integer; Value: TObject);
    procedure SetCount(Value: Integer);
  public
    destructor Destroy; override;
    procedure Clear; override;
    procedure Delete(Index: Integer);
    property Objects[Index: Integer]: TObject read GetObject write SetObject;
    property Count write SetCount;
  end;
  TForm1 = class(TForm)
    AddTestEntryButton: TButton;
    UnicodeEdit: TTntEdit;
    TntMemo1: TTntMemo;
    ListToMemoButton: TTntButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure AddTestEntryButtonClick(Sender: TObject);
    procedure ListToMemoButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Filelist: TFileList;

  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ Clear all the objects from the list and destroy the list. }
destructor TFilelist.Destroy;
begin
 clear;
 inherited Destroy;
end;
{ Return an object from the list. }
function TFilelist.GetObject(Index: Integer): TObject;
begin
  Result := TObject(Items[Index]);
end;
{ Set an object in the list. Free the old object. }
procedure TFilelist.SetObject(Index: Integer; Value: TObject);
begin
  Objects[Index].Free;
  Items[Index] := Pointer(Value);
end;
{ Clear the list by deleting all objects in it. }
procedure TFilelist.Clear;
var
  I: Integer;
begin
  for I := 0 to Count-1 do
    Objects[I].Free;
  inherited Clear;
end;
{ Delete an object from the list, freeing the object }
procedure TFilelist.Delete(Index: Integer);
begin
  Objects[Index].Free;
  inherited Delete(Index);
end;
{ If the list shrinks, free the objects that are implicitly deleted. }
procedure TFilelist.SetCount(Value: Integer);
begin
  while Value < Count do
    Delete(Count-1);
  inherited Count := Value;
end;

constructor TFilelistEntry.Create(const aFrom, aTo: widestring; const aAction: integer);
begin
 self.wFrom:=aFrom;
 self.wTo:=aTo;
 self.Action:=aAction;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Filelist := TFileList.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Filelist.Free;
end;

procedure TForm1.AddTestEntryButtonClick(Sender: TObject);
begin
 Filelist.Add(TFilelistEntry.Create(UnicodeEdit.text,'to',5));
end;

procedure TForm1.ListToMemoButtonClick(Sender: TObject);
var count:integer;
begin
 tntmemo1.clear;
 for count:=0 to filelist.count-1 do
 begin
  tntmemo1.lines.add( TFilelistEntry(filelist[count]).wFrom);

 end;
end;

end.


ist ein kleines testprojekt - das relevante kommt natürlich in eine extra unit und wird besser kommentiert. verbesserungsvorschläge?
wie mache ich die list am sinnvollsten threadsicher?