![]() |
Ich will die Sanduhr zurück!
Hallo zusammen,
blöder Titel, trifft aber beinahe was ich will. Jedes Mal wenn meine Anwendung auf eine DB zugreift (
Delphi-Quellcode:
wird nach Tagesform mal Wasserstand in der Regenrinne div Sekunden der vollen Stunde) die "Sanduhr" angezeigt.
Screen.Cursor:=crHourglass;
Ja, die Abfrage läuft in einem eigenen Thread, die GUI hat also eigentlich genug Zeit sich um Wichtiges zu kümmern. Unter NT war es ein richtiger Volkssport sich eigene Cursor zu basteln, aber das scheint aus der Mode gekommen zu sein. Ich hätte mir sonst da etwas auffälliges für die Datenbank gebastelt. Oder wäre es besser auf der Oberfläche eine "Aktivitätskomponente" zu platzieren, das ist selbst gemacht, da weiß man was man hat? Was würdet Ihr empfehlen? Gruß K-H P.S. Meine Ansprüche würden auch vom "DOS-Turner" (|/-\|/-\) befriedigt. Haupsache man sieht etwas. |
AW: Ich will die Sanduhr zurück!
Das mit dem Cursor würde heute wahrscheinlich niemand mehr verstehen
Heute benutzt man eigentlich nur noch Ladeanimationen als Bild in der GUI. Zumindest an der Webentwicklung sollte der praktischerweise dort sein, wo der Benutzer eine Aktion auslöst. Beispiel: Ich klicke auf meiner Seite auf den Button "Rechnung als bezahlt markieren". Dann verschwindet dieser Button und wird von einer Ladeanimation ersetzt. Das wird auf native Anwendungen wohl auch übertragbar sein. Bei der Bildersuche der Suchmaschine deines Vertrauens findest du mit "loading gif" und "spinner gif" Beispiele für Animationen. Es gibt auch etliche Webseiten, die dir eine Animation generieren, die du dann herunterladen kannst. |
AW: Ich will die Sanduhr zurück!
Ich habe in einer kompakten GUI z.B. eine Ladeanimation direkt im Button gemacht. Sprich der Button wurde inaktiv, bekam die Caption Lade... und unter dem Text erschien eine ProgressBar, die natürlich auch in der Taskleiste entsprechend eingeblendet wurde.
Das hat den Vorteil, dass man das Fenster auch minimieren kann und trotzdem noch den Status sieht. |
AW: Ich will die Sanduhr zurück!
Zitat:
Vielen Dank für die Anregung, dann werde ich mich mal umschauen. (In einer Neueren TOAD-Version habe ich vor kurzem ein Fenster mit "Laufzeit der Abfrage: x sec" gesehen, das war eigentlich nicht schlecht) Vielen Dank K-H |
AW: Ich will die Sanduhr zurück!
Für "Damit der Anwender was zu sehen hat." nehme ich regelmäßig aus der JVCL den TJvProgressDialog.
Der hat 'ne Progressbar, in der man halt die Position verschieben kann und 'ne Caption, in der man "Fortschrittstexte" anzeigen kann. Dazu kommt bei Datenbankabfragen ganz altertümlich
Delphi-Quellcode:
Ja, das mit dem Werden bzw. Sein stimmt wohl, erwischt uns alle irgendwann, da kommt das "Früher war alles Besser" irgendwie ganz von alleine ;-) Ist halt der Anfang vom Ende der Flexibilität beim Älterwerden.
Screen.Cursor := crSQLWait;
Was ich auch ganz gerne mal mache, wenn irgendwelche Arbeitsschritte hintereinander sehr lange dauern:
Delphi-Quellcode:
Wenn's dann fertig ist, kommt wieder der alte Application.Title dahin. Man sieht halt auch bei minimiertem Programm, dass es noch lebt und noch nicht fertig ist.
Application.Title := 'was machen wir-Beschreibung';
Die Sanduhr verschwindet, auch wenn sie eingeschaltet ist, oft, wenn man mit der Maus über irgendwelchen Komponenten vorbeikommt, die entweder irgendwas editierbares haben oder über Scrollbars verfügen. Da wird die Sanduhr dann schonmal beim Drüberkommen umgeändert in das "für die Komponente Richtige" und beim Verlassen nicht zur Sanduhr zurückgeändert, sondern zum Defaultcursor. Ist halt ein bisserl wie Lotto, nur mit weniger "Gewinnchancen" ;-) |
AW: Ich will die Sanduhr zurück!
Zitat:
Ich habe bei einigen Anwendungen ein MSGLabel bzw. ein MSGPanel falls mehrere Arbeitsschritte hintereinander anfallen. Da es sich bei meinem Sorgenkind um eine Dialoganwendung handelt hatte ich so etwas (ähnliches) erst gar nicht in Betracht gezogen. Früher war's nicht besser, es war weniger bunt. Gruß K-H |
AW: Ich will die Sanduhr zurück!
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Das finde ich auch viel intuitiver als nur den Anwendungstitel zu setzen, den ich nur sehe, wenn ich die Maus drüberhalte. Vor allem kann man auch direkt signalisieren, wenn die Aktion pausiert ist oder z.B. ein Fehler passiert ist, durch den eine Benutzereingabe erforderlich ist. Dazu kommt, dass man ein Overlay-Icon setzen kann um direkt in der Taskleiste zu signalisieren was gerade passiert, wenn das in so kleiner Form möglich ist. Das sieht dann z.B. so aus: Anhang 46603 |
AW: Ich will die Sanduhr zurück!
Zitat:
Gruß K-H |
AW: Ich will die Sanduhr zurück!
Du kannst eigentlich an beliebiger Stelle im Progamm einfach Application.Title eine beliebige Zeichenfolge zuweisen. Die wird dann in der Taskleiste angezeigt.
So 'ne Art Fortschrittsanzeige könne so aussehen:
Delphi-Quellcode:
Möchtest Du auch noch das Icon ändern, so müsste Application.Icon dafür die richtige Eigenschaft sein.
var
sTitle : String; begin sTitle := Application.Title; Table1.First; while not Table1.EoF do begin Table1.Edit; // Irgendwas ändern Table1.Post; Table1.Next; Application.Title := Format('ID: %.5d',[Table1.FieldByName('ID').AsInteger]); end; Application.Title := sTitle; end; [EDIT] Wenn Du einen eigenen Dialog haben möchtest, so kannst Du den TJvProgressDialog von den Jedis nehmen. Aktualisieren des Dialoges könnte so gehen:
Delphi-Quellcode:
[/EDIT]
// pd -> Komponente TJvProgressDialog auf dem Formular
type Tform1 = class(TForm) pd: TJvProgressDialog; public { Public-Deklarationen } procedure pdAnzeigen(sCaption : String; sText : String = ''; iMin : Integer = 0; iMax : Integer = 100; iPosition : Integer = 50); procedure pdHide; end; procedure Tform1.pdAnzeigen(sCaption : String; sText : String = ''; iMin : Integer = 0; iMax : Integer = 100; iPosition : Integer = 50); begin pd.Caption := sCaption; pd.Text := sText; pd.Min := iMin; pd.Max := iMax; pd.Position := iPosition; pd.Show; if sText <> '' then Application.Title := sText; end; procedure TfmTextverwaltung.pdHide; begin pd.Hide; Application.Title := 'Mein Programmname'; end; // irgendwo im Programm var iMin : Integer; iMax : Integer; iPos : Integer; sCaption : String; sText : String; begin Screen.Cursor := crSQLWait; pdAnzeigen('Datenbankabfrage läuft ...'); qrySQL.ExecSQL; // oder pdAnzeigen('SQL-Statement wird ausgeführt ...',qrySQL.SQL.Text); qrySQL.ExecSQL; //oder: pdAnzeigen('Öffne Abfrage ...',qrySQL.SQL.Text); qry.Open; iMin := 0; iMax := qry.RecordCount; iPos := 0; sCaption := Format('%d Datensätze werden verarbeitet ...',[iMax]); sText := ''; pdAnzeigen(sCaption, sText, iMin, iMax , iPos); qry.First while not qry.Eof do begin Inc(iPos); sText := Format('ID: %.5d',[qry.FieldByName('ID').AsInteger]); pdAnzeigen(sCaption, sText , iMin, iMax, iPos); // Irgendwas mit den Daten machen ... qry.Next; end; qry.Close; pdHide; Screen.Cursor := crDefault; |
AW: Ich will die Sanduhr zurück!
Mal schauen,
Vielen Dank! K-H |
AW: Ich will die Sanduhr zurück!
Es sei aber gesagt, dass nahpets' Lösung nicht das erreicht was auf jaenickes Screenshot zu sehen ist. Genau genommen würden die meisten Anwender diesen Application Title heute gar nicht mehr zu Gesicht bekommen. Über
![]() Als zusätzliche Maßnahme finde ich die Idee gut, aber nur einen anderen Cursor und diesen Titel ist nicht mehr zeitgemäß. |
AW: Ich will die Sanduhr zurück!
Seit XE7 oder XE8 gibt es eine Komponente
![]() Wenn du diese Version nicht besitzt, dann kannst du dir allerdings durch die Interfaces von Microsoft behelfen und somit den gleichen Effekt erzielen. ![]() ![]() ![]() |
AW: Ich will die Sanduhr zurück!
Zitat:
Solange der Benutzer gut erkennen kann, das ein Programm etwas arbeitet ("es tut nichts, dann tut es was") ist alles gut. Je nachdem ist ein Cursor oder ein Progressbar natürlich Augenwischerei, aber es ist gut für den Blutdruck des Benutzers. Gruß K-H |
AW: Ich will die Sanduhr zurück!
Mh, ich verstehe nicht was es nicht zu verstehen gibt. :stupid:
Ich habe zwei Dinge in diesem Thread gesagt: Den Cursor würde heute keiner mehr sehen und Application.Title sieht auch niemand mehr. Wenn man also nur diese beiden Dinge zur Benachrichtigung verwendet, sehen viele Benutzer keine Indikation für einen laufenden Vorgang mehr. Man kann natürlich nach "es tut nichts, dann tut es was" arbeiten, das wäre aber nicht der Standard den ich verfolge(n muss). Ich bin zwar wie gesagt in der Webentwicklung tätig, aber dafür sind unsere Kunden (mit Verlaub) besonders strohdoof. Da muss man sich um jede Indikation wirklich Gedanken machen... :? |
AW: Ich will die Sanduhr zurück!
Zitat:
Dir einzige immer sichtbare Methode seit Windows 7 ist die Fortschrittsanzeige direkt auf dem Taskbar Eintrag. (Selbst wenn man die Taskleiste mit der Anzeige der Titel überflutet, was man ja auch ab Windows 7 leider noch einstellen kann, ist das sichtbar.) Es ist auch die einzige Methode, bei der man ohne zu lesen den Status sieht. |
AW: Ich will die Sanduhr zurück!
Zitat:
Zitat:
|
AW: Ich will die Sanduhr zurück!
Zitat:
|
AW: Ich will die Sanduhr zurück!
Erst einmal vielen Dank für die vielen Anregungen!
Da ich heute noch einmal bemerken durfte wie, unzuverlässig die Taskbar(Darstellung) ist, werde ich dies als Zweitmöglichkeit nutzen. Meine primäre Lösung wäre eine Progressbar oder etwas verwandtes auf dem Mainform. ![]() Gruß K-H |
AW: Ich will die Sanduhr zurück!
Ungetestet, da nur grob abgekupfert:
Delphi-Quellcode:
Damit müsste man eine Progressbar auf ein Panel einer Statusbar legen können, dabei gehe ich mal davon aus, dass die Statusbar mindestens 1 Panel hat.
procedure SetProgressBarOnPanel(stb : TStatusBar; pb : TProgressBar; iPanelNo : Integer);
var PanelRect : TRect; ProgressBarStyle : LongInt; begin if pb.Parent <> stb then pb.Parent := stb; ProgressBarStyle := GetWindowLong(pb.Handle, GWL_EXSTYLE); ProgressBarStyle := ProgressBarStyle - WS_EX_STATICEDGE; SetWindowLong(pb.Handle, GWL_EXSTYLE, ProgressBarStyle); SendMessage(stb.Handle, SB_GETRECT, iPanelNo, Integer(@PanelRect)); pb.SetBounds(PanelRect.Left + 1, PanelRect.Top + 1, PanelRect.Right - PanelRect.Left - 2, PanelRect.Bottom - PanelRect.Top - 2); end;
Delphi-Quellcode:
type
Tform1 = class(TForm) pb: TProgressBar; stb: TStatusBar; ... // Im FormCreate oder so: SetProgressBarOnPanel(stb,pb,0); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 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