AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Progressbar um Loadfromfile fortschritt anzuzeigen.
Thema durchsuchen
Ansicht
Themen-Optionen

Progressbar um Loadfromfile fortschritt anzuzeigen.

Ein Thema von Nelphin · begonnen am 19. Dez 2009 · letzter Beitrag vom 19. Dez 2009
Antwort Antwort
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#1

Re: Progressbar um Loadfromfile fortschritt anzuzeigen.

  Alt 19. Dez 2009, 10:16
Zitat von himitsu:
Tut mir Leid, aber diese Streamdekoratoren bringen nicht wirklich, denn eine StringList ließt erstmal den gesamten Stream oder die Datei ein, seit D2009 wird der dann im Ganzen decodiert (TEncoding) und danach als Ganzes an SetTextStr aka .Text übergeben ... das Einlesen ist also nur ein Bruchteil dessen, was da passiert.

Also bringt es nicht viel, da was NUR am Stream machen zu wollen.

Hier hätte man erstmal eine Variante für BIS Delphi 2007, wo allergings erstmal nur die Stringaufteilung beachtet wird.
[add]
OK, hab noch schnell LoadFromStream reingemacht, wo und nur wird mit -1 der Start des Einlesens der Daten aus dem Stream, bzw. aus der Datei angezeigt und bei 0 würde mit dem Zerlegen des Textes begonnen.

Wenn das jemand noch für D2009/D2010 haben will, so möge er sich melden.
(dort wurde ja so Einiges erweitert)
[/add]
Delphi-Quellcode:
// If Progress = -1 then, it will start reading the file/stream data.
Type TProgressyEvent = Procedure(Sender: TObject; Progress: Byte) of Object;
  TProgressStrings = Class(TStringList)
  Private
    FProgress: TProgressyEvent;
  Protected
    Procedure SetTextStr(Const Value: String); Override;
    Property OnProgress: TNotifyEvent Read FProgress Write FProgress;
  Public
    Procedure LoadFromStream(Stream: TStream); Override;
  End;

Procedure TProgressStrings.SetTextStr(Const Value: String);
  Var
    P, Start: PChar;
    S: String;
  Begin
    BeginUpdate;
    Try
      If Assigned(FProgress) Then FProgress(Self, 0);
      Clear;
      P := Pointer(Value);
      If P <> nil Then
        While P^ <> #0 do Begin
          Start := P;
          While not (P^ in [#0, #10, #13]) do Inc(P);
          SetString(S, Start, P - Start);
          Add(S);
          If P^ = #13 Then Inc(P);
          If P^ = #10 Then Inc(P);
          If Assigned(FProgress) Then FProgress(Self,
            Length(Value) * 100 div (Integer(P) - Integer(Value)));
        End;
      If Assigned(FProgress) Then FProgress(Self, 100);
    Finally
      EndUpdate;
    End;
  End;

Procedure TStrings.LoadFromStream(Stream: TStream);
  Var
    Size: Integer;
    S: String;
  Begin
    BeginUpdate;
    Try
      Size := Stream.Size - Stream.Position;
      If Assigned(FProgress) Then FProgress(Self, -1);
      SetString(S, nil, Size);
      Stream.Read(Pointer(S)^, Size);
      SetTextStr(S);
    Finally
      EndUpdate;
    End;
  End;
Will man auch noch das Laden haben, dann müßte man noch LoadFromStream überschreiben, dann hätte man schonmal den Begin des Ladens und die Zeit für's Decodieren, und will man auch noch das Laden selber, dann müßte man wirklich noch eine Streambehandlung implementieren.
hmm jetzt hast du mich neugierig gemacht... ich verstehe davon nicht wirklich viel, wie bringe ich das zum laufen?
ich habe versucht es in eine anwendung reinzupasten dabei musste ich aber die Zeile
Procedure TStrings.LoadFromStream(Stream: TStream); in
Procedure TProgressStrings.LoadFromStream(Stream: TStream); ändern weil mein delphi meinte Unit2 enthielte kein element mit namen Loadfromstream...

jetzt sind die fehler weg aber wenn ich compilieren will kommt für die Zeile:

 Property OnProgress: TNotifyEvent Read FProgress Write FProgress; die Fehlermeldung:
Zitat:
[Pascal Fehler] Unit2.pas(30): E2010 Inkompatible Typen: 'TProgressyEvent' und 'TNotifyEvent'
was muss ich sonst noch auf meinem formular haben damit dein code funktioniert?
testweise habe ich zur zeit folgende ladeprocedur in einen butten geklatscht:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var laden:Topendialog;
var start,dauer:Cardinal;
var sl:tstringlist;
begin

Laden:=Topendialog.create(self);
sl:=TStringlist.Create;

 if Laden.execute then begin
    start := GetTickCount();
      sl.LoadFromFile(laden.FileName);

 end;

dauer := GetTickCount() - start;


panel1.caption:='Laden hat '+(floattostr(dauer/1000))+' Sekunden gedauert';

end;
und eine progressbar in die form gezogen... wie vertüdel ich jetzt das alles richtig?
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:13 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