![]() |
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 |
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.
|
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:
Eine kleine Schwachstelle hat es leider noch. Wenn ich den Speichervorgang
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.
Delphi-Quellcode:
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.
Excel.Worksheets[1].SaveAS('D:\Tischsteuerung\Steuerungsprogramm Version 1.103\Sensoren.xls');
Fehlermeldung: "Exception-Klasse EVariantInvalidOpError mit Meldung 'Ungültige Variantenoperation." Vielen Dank BAMatze |
Re: Speicherbalken
Was bringt dir ein Fortschrittsbalken der irgendwas anzeigt?
Zumal deine Progressbar "überlaufen" kann... |
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:
|
Re: Speicherbalken
Du meinst warscheinlich die nomrale Notation mit Form1.Excel. ... aber dies ist auch nicht funktionstüchtig. Hatte ich als erstes getestet.
|
Re: Speicherbalken
Zitat:
|
Re: Speicherbalken
Ist die Unit, wo Form1 enthalten ist auch an der aufrufenden Stelle (in der anderen Form) eingebunden?
|
Re: Speicherbalken
Zitat:
Ich würde dir eher eine alternierende Progressbar oder einen animierten Sanduhr-Cursor nehmen. |
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 19:57 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 by Thomas Breitkreuz