Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Speicherbalken (https://www.delphipraxis.net/125763-speicherbalken.html)

BAMatze 11. Dez 2008 07:46


Speicherbalken
 
Hallo,

ich arbeite mit einem OleContainer in dem mit Excel gearbeitet wird. Wenn ich Änderungen speichere, dann dauert das Speichern so 2-10s (wobei nicht auszuschließen ist, dass bei größeren Datenmengen nicht auch das Speichern mal weit aus länger dauern kann. Würde jetzt eigentlich gerne einen Statusbalken (wie auch bei Word üblich) programmieren, der anzeigt, wie weit der Vorgang ist. gibt es eine einfache Methode herauszubekommen, wie weit oder wie lange der Speichervorgang dauert?

Danke
BAMatze

mkinzler 11. Dez 2008 07:53

Re: Speicherbalken
 
Da ja der OLEServer( hier Excel) das Speichern zuständig ist, kann dein Programm über den Fortschritt ja nicht wissen. Mir wäre auch Benachrichtigungsmöglichkeit dessen COM-Schnittstelle bekannt.

BAMatze 11. Dez 2008 08:23

Re: Speicherbalken
 
Habe hier eine Möglichkeit gerade erstellt, die zwar nicht wirklich den genauen Speicherzustand wiederspiegelt, aber für den Benutzer ist das ja nicht wirklich interessant. Für mich ist es aber eine Möglichkeit, die Speicherzeit zu überbrücken. habe die Speicherprozesse in eine extra Form kopiert und setze vor dem Speichern eine Variable auf falsch. Wenn das Speichern vorbei ist, wird diese Variable auf wahr gesetzt. Nebenbei läuft ein Timer, der allerdings unabhängig von dem Speichervorgang den ProgressBar füllt. Das komplette Befüllen ist ihm aber erst erlaubt, wenn die Variable auf wahr (d.h. der Speichervorgang ist wirklich abgeschlossen) umgeschaltet ist. Hier mal den Quellcode meiner ebend beschriebenen Lösung:

Delphi-Quellcode:
unit Speichern;

interface

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

type
  TForm7 = class(TForm)
    Label1: TLabel;
    ProgressBar1: TProgressBar;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form7: TForm7;
  Fortschrittsanzeige: boolean;

implementation

{$R *.dfm}

procedure TForm7.FormCreate(Sender: TObject);
begin
  randomize;
  Form1.Enabled := true;
  Fortschrittsanzeige := false; // Variable anhand derer festgestellt wird, ob der Speichervorgang beendet ist
  Excel.Worksheets[1].SaveAS('D:\Tischsteuerung\Steuerungsprogramm Version 1.103\Sensoren.xls'); { <---------- hier gibt es noch einen Fehler!!!}
  Form1.OleContainer1.DestroyObject; {Objekt muss aktualisiert werden sonst werden die Änderungen nach dem Schliesen des OleContainers nicht sichtbar}
  Form1.OleContainer1.CreateObjectFromFile('D:\Tischsteuerung\Steuerungsprogramm Version 1.103\Sensoren.xls', false); // neu laden
  Fortschrittsanzeige := true;
end;

procedure TForm7.Timer1Timer(Sender: TObject);
var iTemp: integer;
begin
  //Fortschrittsanzeige wird nicht voll befüllt, wenn Speichern nicht abgeschlossen ist
  if (Fortschrittsanzeige = False) and (ProgressBar1.Position < 90) then
    begin
      iTemp := random(5);
      ProgressBar1.Position := Progressbar1.Position + iTemp;
    end;
  //Fortschrittsanzeige kann vollständig befüllt werden, wenn Speichern abgeschlossen ist
  if (Fortschrittsanzeige = true) then
    begin
      iTemp := random(10);
      ProgressBar1.Position := Progressbar1.Position + iTemp;
    end;
  //wenn Progressbar vollständig befüllt ist, dann soll die Form wieder verlassen werden
  if (ProgressBar1.Position >= 100) then
    begin
      ProgressBar1.Position := 0;
      Form1.Enabled := false;
      close;
    end;
end;

end.
Eine kleine Schwachstelle hat es leider noch. Wenn ich den Speichervorgang
Delphi-Quellcode:
   Excel.Worksheets[1].SaveAS('D:\Tischsteuerung\Steuerungsprogramm Version 1.103\Sensoren.xls');
in der ursprünglichen Form starte funktioniert es wunderbar. In der neuen Form bekomme ich leider immer eine Fehlermeldung. Vieleicht kann mir jemand sagen, woran dies liegt.

Fehlermeldung: "Exception-Klasse EVariantInvalidOpError mit Meldung 'Ungültige Variantenoperation."

Vielen Dank
BAMatze

SauberMann 11. Dez 2008 08:47

Re: Speicherbalken
 
Was bringt dir ein Fortschrittsbalken der irgendwas anzeigt?
Zumal deine Progressbar "überlaufen" kann...

Xong 11. Dez 2008 09:14

Re: Speicherbalken
 
Zum Fortschritt der Progressbar: Nutze dafür doch eine Funktion, die die 100 nie erreicht, sich ihr aber annähert.
Diese Funktion hat bei 7-8 Sekunden den Wert 90 und sollte somit einigermaßen stimmen.
Damit gehst du sicher, dass der Nutzer merkt, dass noch was passiert, der Balken aber nicht überlaufen kann.

Zitat:

Zitat von BAMatze
Eine kleine Schwachstelle hat es leider noch. Wenn ich den Speichervorgang
Delphi-Quellcode:
   Excel.Worksheets[1].SaveAS('D:\Tischsteuerung\Steuerungsprogramm Version 1.103\Sensoren.xls');
in der ursprünglichen Form starte funktioniert es wunderbar. In der neuen Form bekomme ich leider immer eine Fehlermeldung. Vieleicht kann mir jemand sagen, woran dies liegt.

Überlege, wo Excel deklariert ist und wie in Form7 darauf zugegriffen werden kann.

BAMatze 11. Dez 2008 10:02

Re: Speicherbalken
 
Du meinst warscheinlich die nomrale Notation mit Form1.Excel. ... aber dies ist auch nicht funktionstüchtig. Hatte ich als erstes getestet.

Xong 11. Dez 2008 10:23

Re: Speicherbalken
 
Zitat:

Zitat von BAMatze
Du meinst warscheinlich die nomrale Notation mit Form1.Excel. ... aber dies ist auch nicht funktionstüchtig.

Weil?

himitsu 11. Dez 2008 14:26

Re: Speicherbalken
 
Ist die Unit, wo Form1 enthalten ist auch an der aufrufenden Stelle (in der anderen Form) eingebunden?

SauberMann 12. Dez 2008 14:17

Re: Speicherbalken
 
Zitat:

Zitat von Xong
Zum Fortschritt der Progressbar: Nutze dafür doch eine Funktion, die die 100 nie erreicht, sich ihr aber annähert.
Diese Funktion hat bei 7-8 Sekunden den Wert 90 und sollte somit einigermaßen stimmen.

Aber sobald dein Balken den Wert 90-94 hat, bewegt er sich auch nicht mehr. Was ist mit schnelleren oder langsameren Rechnern?
Ich würde dir eher eine alternierende Progressbar oder einen animierten Sanduhr-Cursor nehmen.

BAMatze 16. Dez 2008 07:14

Re: Speicherbalken
 
Die Form1 ist die EFPI_Steuerungsunit1 und ist unter Uses eingebunden, wie im Einleitungsbeitrag (welches ich aus diesem Grund auch eingestellt habe) zu erkennen ist.

Deswegen bitte ich alle, die eventuell noch einen Fehler sehen, warum das Speichern nicht so funktioniert, wie ich das will, dass sie dies nochmal posten.

Danke
BAMatze


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 Uhr.
Seite 1 von 2  1 2      

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