AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherbalken

Ein Thema von BAMatze · begonnen am 11. Dez 2008 · letzter Beitrag vom 2. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

Speicherbalken

  Alt 11. Dez 2008, 07:46
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Speicherbalken

  Alt 11. Dez 2008, 07:53
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.
Markus Kinzler
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Speicherbalken

  Alt 11. Dez 2008, 08:23
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
   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
  Mit Zitat antworten Zitat
SauberMann

Registriert seit: 18. Nov 2008
13 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Speicherbalken

  Alt 11. Dez 2008, 08:47
Was bringt dir ein Fortschrittsbalken der irgendwas anzeigt?
Zumal deine Progressbar "überlaufen" kann...
Max
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Speicherbalken

  Alt 11. Dez 2008, 09:14
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 von BAMatze:
Eine kleine Schwachstelle hat es leider noch. Wenn ich den Speichervorgang
   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.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Speicherbalken

  Alt 11. Dez 2008, 10:02
Du meinst warscheinlich die nomrale Notation mit Form1.Excel. ... aber dies ist auch nicht funktionstüchtig. Hatte ich als erstes getestet.
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Speicherbalken

  Alt 11. Dez 2008, 10:23
Zitat von BAMatze:
Du meinst warscheinlich die nomrale Notation mit Form1.Excel. ... aber dies ist auch nicht funktionstüchtig.
Weil?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#8

Re: Speicherbalken

  Alt 11. Dez 2008, 14:26
Ist die Unit, wo Form1 enthalten ist auch an der aufrufenden Stelle (in der anderen Form) eingebunden?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
SauberMann

Registriert seit: 18. Nov 2008
13 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Speicherbalken

  Alt 12. Dez 2008, 14:17
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.
Max
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Speicherbalken

  Alt 16. Dez 2008, 07:14
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:21 Uhr.
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