AGB  ·  Datenschutz  ·  Impressum  







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

OpenDialog - Relikt in *.pgn-Tool

Ein Thema von wendelin · begonnen am 21. Dez 2014 · letzter Beitrag vom 23. Dez 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

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

AW: OpenDialog - Relikt in *.pgn-Tool

  Alt 21. Dez 2014, 19:38
Wenn ich mir den obigen Code so anschaue, würde da nicht vielleicht ein BeginUpdate und ein EndUpdate schon viel bringen?
Nein, nicht wirklich, außer MyStringListA ist keine TStringList.

Es würde viel mehr bringen, wenn man nicht sinnlos dem arschlangsamen Memo mehrmals den kompletten Inhalt neu zuweist.

Delphi-Quellcode:
procedure TMyPGN.SpeedButton7Click(Sender: TObject);
VAR
  MyFileName : String;
begin
  OpenDialog2.FileName := g_ArbeitsVerz;
  OpenDialog2.InitialDir := g_ArbeitsVerz;
  MyFileName := 'Ihre Eingabe';
  OpenDialog1.FileName := g_ArbeitsVerz + MyFileName;
  if not OpenDialog1.Execute then
    Exit; // Wenn man auf Abbrechen drückte, dann wurde dennoch alles in MyStringListA dennoch verarbeitet?
  MyStringListA.LoadFromFile(OpenDialog1.FileName);
  If Trim(MyStringListA.Strings[0]) <> 'then // auf erste/letzte Zeile zugreifen ... und was wenn es keine Zeilen gibt?
    MyStringListA.Insert(0, ''); // wenn am Anfang eine Leerzeine, dann NOCHMAL Eine dahin?
  If Trim(MyStringListA.Strings[MyStringListA.Count - 1]) <> 'then
    MyStringListA.Add(''); // hier auch?
  Memo1.Lines.Text := MyStringListA.Text; // einmal zuweisen reicht und vorher zu löschen war eh nutzlos
  Panel5.Caption := 'Zeilen :' + IntToStr(MyStringListA.Count); // Zahl der Zeilen anzeigen
  AusgabeAnzahlPartienAlt;
  Gewinn_Verlust_Remis_NEU;

Ach ja, Threads bringen hier absolut garnichts, da die meiste Zeit, praktisch fast die Ganze, mit Zugriffen auf die VCL verbraten werden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Dez 2014 um 20:05 Uhr)
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
121 Beiträge
 
Delphi 7 Enterprise
 
#12

AW: OpenDialog - Relikt in *.pgn-Tool

  Alt 22. Dez 2014, 10:58
Hallo, mal ein paar allgemeine Bemerkungen.

1. Sicher hast Du recht, den Code kann man kürzen.
2. Ich bin reiner Hobby-Prog.
3. Aus vielen Antworten von versch. IT-Crack's ?? in dieser Comm. kann man immer wieder eine gewisse Arroganz herauslesen.
(zu manchen Fragen erfolgt KEINE substantielle Antwort aber ziemlich viel Nonsens)
4. Vor meiner Pensionierung war ich niedergelassener Arzt.
Was glaubst Du, was die Pat. gesagt hätten, wenn ich auf med. Fragen meiner Pat. geantwortet hätte : Schauen Sie doch mal in die 'Rentner-Bravo'
(Apotheken-Rundschau) oder ins Internet.


Dr.M.U. alias Wendelin
Wolfgang
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#13

AW: OpenDialog - Relikt in *.pgn-Tool

  Alt 22. Dez 2014, 12:46
Hallo Doc,

Zustimmung in allen Punkten. In dieser Hinsicht haben wir Gemeinsamkeiten. Als IT-Autodidakt, der wie einige Andere hier kein IT-Studium hinter sich hat, wird man manchmal etwas "von oben herab" behandelt, vielleicht sogar als "geistig weniger bemittelt" betrachtet, wenn man Code schreibt oder Ansichten vertritt, die nicht Stand der Technik, oder im Sinne der hier anwesenden Spezialisten sind.

Ich kann mich nur schwer an diese Umgangsformenk gewöhnen, aber, was solls. Es sind überwiegend die "jungen Wilden" die auch untereinander nicht mehr mit der Geduld und der Höflichkeit umgehen, die wir (...alten Säcke...<g>...) als Standard betrachten. Um es mal in Doc-Sprache zu sagen: Das Rezept ist einfach anzunehmen, alternative Therapievorschläge sind kontraindiziert.

Um aber nochmals zum Thema zurück zu kommen. Hast du denn "das Verbotene" schon ausprobiert?
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#14

AW: OpenDialog - Relikt in *.pgn-Tool

  Alt 22. Dez 2014, 13:08
Auch wenn die Art und Weise vielleicht nicht immer nach jedermanns Gusto ist, halte ich es dennoch für richtig (und wichtig) darauf hinzuweisen, dass eine vorgeschlagene Therapie nicht zur Heilung, sondern nur zum Kaschieren der Symptome taugt, und bei vielen Patienten auch noch nach Jahren zu erheblichen Nebenwirkungen und Folgeerkrankungen führen kann. (Und das ist jetzt gar nicht mal so arg metaphorisch gemeint wie man denken könnte in diesem Fall hier.) Würden sich Ärzte derartiges verschweigen, wäre ich als Patient gelinde gesagt leicht nervös.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#15

AW: OpenDialog - Relikt in *.pgn-Tool

  Alt 22. Dez 2014, 13:27
Um aber nochmals zum Thema zurück zu kommen. Hast du denn "das Verbotene" schon ausprobiert?
Ich bin kein Arzt und würde mir deshalb auch niemals erlauben, irgendeine Diagnose zu stellen. Informatik habe ich auch nicht studiert und das Programmieren habe ich mir weitestgehend selbst beigebracht. Ich traue mir aber dennoch zu, in Bezug auf Delphi/Pascal-Programmierung durchaus fundierte und belastbare Aussagen zu treffen und Empfehlungen zu geben, die überwiegend auf einer über 30-jährigen Erfahrung beruhen.

Daher, um für die noch nicht so lange zugehörigen Forenmitglieder mal zu verdeutlichen, warum Application.ProcessMessages "verboten" ist: Mit diesem Aufruf werden Nachrichten aus der MessageQueue abgearbeitet. Das mag für das Neuzeichnen des Forms hier vielleicht noch erwünscht sein, für andere Eventhandler fällt das aber im Allgemeinen unter die Rubrik "unerwartet".

Nehmen wir z.B. mal diesen einfachen Code in einem Eventhandler an:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  DoSomeStuff;
  if OpenDialog1.Execute then begin
    Application.ProcessMessages;
    DoSomeOtherStuffThatNeedsSomeTime;
  end
  else begin
    DoSomeEvenOtherStuff;
  end;
end;
Bei einem Click auf Button1 wird nun zunächst DoSomeStuff aufgerufen, dann der Dialog geöffnet und nach Bestätigen beendet. Nehmen wir nun noch an, daß der User während DoSomeStuff nochmal auf den Button klickt, sei es aus Ungeduld, fehlendem Feedback des Programms oder motorischer Unzulänglichkeit. Das nun folgende Application.ProcessMessages wertet diesen Click aus, ruft DoSomeStuff auf und öffnet den Dialog erneut. Dabei ist DoSomeOtherStuffThatNeedsSomeTime aber noch gar nicht gelaufen. Wird der Dialog abgebrochen, erfolgt ein Aufruf von DoSomeEvenOtherStuff, der Eventhandler wird beendet, das Application.ProcessMessages ebenso und es folgt ein DoSomeOtherStuffThatNeedsSomeTime.

Aus dem eigentlich vorhersehbaren und durchaus überschaubaren Event-Handling ist ein ziemliches Wirrwar im Programmablauf geworden, daß selbst erfahrene Programmierer kaum noch nachvollziehen, geschweige denn in den Griff kriegen können. Und hier habe ich bewusst nur den einen Eventhandler betrachtet. Es kann auch durchaus zu konkurrierenden Abläufen in mehreren Eventhandlern auch in unterschiedlichen Forms kommen. Meistens versucht man dann durch zusätzliche Flags das Reentering der Eventhandler zu unterbinden. Das fördert aber nicht gerade die Lesbarkeit und Wartbarkeit eines Programms.

Ich weiß nicht, wie oft ich schon sporadische Laufzeitfehler in fremdem Code suchen musste, bei dem sich das Problem auf mindestens einen Aufruf von Application.ProcessMessages zurückführen ließ. Dabei schließe ich frei verfügbare und käuflich erwerbbare Bibliotheken (z.B. RxLib oder QuickReport um nur zwei zu nennen) gar nicht aus. Das ist dann ganz besonders gemein, da der eigentliche Programmcode ja durchaus korrekt sein mag und es nur wegen eines entsprechenden Aufrufs innerhalb der Bibliothek zu der Fehlfunktion kommt.

Deshalb ist Application.ProcessMessages meiner Meinung nach einfach verboten. Es ist nur ein Hilfmittel um eigentlich schlechten oder gar falschen Code trotzdem noch halbwegs zum Laufen zu bringen. Man erweist sich dadurch also nur einen Bärendienst.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#16

AW: OpenDialog - Relikt in *.pgn-Tool

  Alt 22. Dez 2014, 14:56
Hallo Uwe,

über diese Nebeneffekte von Application.ProcessMessages habe ich schon geflucht wie ein Hufschmied. Aber, sobald man dann mal konkret eine Frage nach einer Alternative stellt, gibt's meistens entweder keine Antwort, oder welche mit so viel "wenn und aber" drin, dass sich mir eine bessere Alternative bisher nicht erschlossen hat: Bei modalen Aufrufen und sonst wo es geht, Form.Enabled:=false, oder die Komponente(n) die eine Rekursion auslösen könnten disablen, während eine Aktion läuft.

In diesem Fall müsste man halt den SpeedButton disablen, um sicher zu gehen.

Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  SpeedButton1.Enabled := false;
  try
    Tu was
  finally
    SpeedButton1.Enabled := true;
    Application.Processmessages;
  end;
end;
Für alternative oder bessere Vorschläge hab ich immer ein offenes Ohr!
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#17

AW: OpenDialog - Relikt in *.pgn-Tool

  Alt 22. Dez 2014, 15:15
Es gibt verschiedene Ansätze, die je nach Anforderung mehr oder weniger gut geeignet sind. Die am häufigsten genannte ist sicher, die Arbeit in einen Thread auszulagern. Das bringt natürlich andere Probleme mit sich, denen man sich bewusst sein muss.

Wenn die Aufgabe das zulässt kann man die Arbeit auch schrittweise ausführen - z.B. immer x Zeilen lesen und verarbeiten und das Update der GUI vielleicht in einem Schritt am Ende ausführen. Der Event wird dann zeinah verlassen und die einzelnen Steps triggert man z.B. mit einer Windows-Message an das Form. Eventuell lagert man die schrittweise Verarbeitung in eine eigene Klasse aus um das Form nicht zu überladen. Dann kann man gleich auch einen Progressbar mitlaufen lassen, der dem Anwender den Fortschritt anzeigt. Eine allgemein gültige Herangehensweise gibt es leider nicht.

Wichtig ist, daß man erstmal feststellt, wo denn überhaupt die Zeit verbraten wird, damit man nicht an der falschen Stelle rumdoktert. Vielleicht sitzt das Problem ja in diesem Fall gar nicht bei der Memo-Zuweisung sondern in den beiden Methoden, die am Ende aufgerufen werden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
121 Beiträge
 
Delphi 7 Enterprise
 
#18

AW: OpenDialog - Relikt in *.pgn-Tool

  Alt 23. Dez 2014, 09:48
Hallo,

danke für Eure Erklärungen bez. Application Process.. u.s.w.
Wäre für mich sowieso nicht in Frage gekommen, da ich damit nur schlechte Erfahrungen gemacht habe.
Außerdem macht es die entsprechenden Procs. deutlich langsamer.
Zu meiner ursprünglichen Frage : Vielleicht gibt es ja in der API eine Möglichkeit vor oder auch nach dem Öffnen eines Open/Save-
Dialog - Fenster's dieses so zu verschieben, daß es NICHT das Main-Window überdeckt ? (Kann man natürlich auch manuell machen, wär
aber eleganter).

Frohe Weihnachten, Wendelin
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: OpenDialog - Relikt in *.pgn-Tool

  Alt 23. Dez 2014, 10:07
Zu meiner ursprünglichen Frage : Vielleicht gibt es ja in der API eine Möglichkeit vor oder auch nach dem Öffnen eines Open/Save-
Dialog - Fenster's dieses so zu verschieben, daß es NICHT das Main-Window überdeckt ? (Kann man natürlich auch manuell machen, wär
aber eleganter).
Da gibt es keine offizielle API (Jedenfalls keine Einfache - Man kann sich naturlich das Fensterhandle geben lassen und mit SetWindowPos es umschieben). Und wohin willst du es verschieben wenn diene Anwendung z.B. im Vollbild läuft?
Das Problem ist doch ganz einfach das das entsprechende Fensterteil keine Möglichkeit hat sich neu zu zeichnen.

Statt Application.Processmessages wäre u.U. ein Update/Repaint/Refresch-Aufruf hilfreich.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 16:56 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