Autor Beitrag
Midori
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 10.10.05 11:45 
Hallo.

Ich speicher eine Komponente und wenn ich es neu lade wird seltsamerweise der Ladevorgang jedesmal langsamer. Beim ersten laden 1s, beim zweiten schon 2s und dritten dann 3s. Die Komponente bringt selber diese Routine mit. Eventuell sieht jemand den Fehler und kann mir helfen das zu optimieren?

EDIT: Das laden bezieht sich auf das mehrmalige öffnen in der selben laufenden Anwendung. Wenn ich diese beende und das Programm neu starte, fängt das spiel von schnell zu langsam von vorne an.


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:
  TBlockViewer = class(TCustomControl)
  public
    property Document: BlockDocument read FBlockDocument write SetBlockDocument;
    procedure LoadFromTextFile(AFileName: string);
  end;


procedure TBlockViewer.LoadFromTextFile(AFileName: string);
var
  B: BlockDocument;
begin
  FreeAndNil(FBlockDocument);
  B := BlockDocument.Create(nil);
  B.LoadFromTextFile(AFileName);
  Document := B;
end;



  BlockDocument = class(TComponent)
  private
    FRoot: Root;
  public
    procedure LoadFromTextFile(AFileName: string);
    property BlockRoot: Root read FRoot write FRoot;
  end;



procedure BlockDocument.Clear;
begin
  BlockRoot.Free;
  BlockRoot := Root.Create(Self);
end;

procedure BlockDocument.LoadFromTextFile(AFileName: string);
var
  F: TFileStream;
begin
  F := TFileStream.Create(AFileName, fmOpenRead);
  try
    Clear;
    LoadBlockDocument(F, Self);
  finally
    F.Free;
  end;
end;



procedure LoadBlockDocument(Stream: TStream; BlockDocument: TComponent);
var
  StrStream: TStringStream;
  BinStream: TMemoryStream;
begin
  { Load object }
  StrStream := TStringStream.Create('');
  try
    StrStream.CopyFrom(Stream, Stream.Size);
    StrStream.Seek(0, soFromBeginning);
    
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream, BinStream);
      BinStream.Seek(0, soFromBeginning);

      BinStream.ReadComponent(BlockDocument);
    finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;