AGB  ·  Datenschutz  ·  Impressum  







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

Mehrfachen Schleifenaufruf verhindern

Ein Thema von sko1 · begonnen am 8. Feb 2018 · letzter Beitrag vom 9. Feb 2018
Antwort Antwort
sko1

Registriert seit: 27. Jan 2017
607 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

AW: Mehrfachen Schleifenaufruf verhindern

  Alt 8. Feb 2018, 14:26
Danke für die vielen Denkanstöße!

Die beiden Hinweise betreffend ChangeSelection und Paint sind erst mal die wichtigsten, wobei ich .Paint mit Sicherheit probiert habe, genau so wie .Refresh, allerdings im OnChange-Event!

Dass ChangeSelection gefeuert wird, wenn man tippt, war mir bisher nicht bewusst, man lernt halt nie aus

Dann mach ich mich mal ans Ändern...

Ciao
Stefan
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
607 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Mehrfachen Schleifenaufruf verhindern

  Alt 9. Feb 2018, 05:57
Zitat:
for i := 1 to 100 do
begin
WPRichText1.ActiveParagraph.Append(IntToStr(i));
WPRichText1.ReformatAll;
WPRichText1.Paint;
Sleep(50);
end;
Funktioniert, ändert aber nach langen Tests an meinem eigentlichen Problem nichts:
Im obigen Code kommen die Änderungen aus dem Code, bei mir wird das erste eingetippte Zeichen jetzt sofort angezeigt (.Paint, ich hatte immer .Repaint probiert!) aber dann kommen weitere getippte zeichen erst an wenn der Schleifencode abgearbeitet ist!

Hier werden also scheinbar die Messages der getippten Zeichen "verzögert" weitergereicht!

Ich denke hier wird eine TList mit den zu sendenden Messages und ein Thread der sich um das Versenden kümmert, die einzige saubere Lösung sein!

Darf ich in s´dem Zusammenhang einfach mal fragen (da keine Erfahrung) was bei PostMessage passiert außer dass es keine Rückmeldung gibt?
Können Messages verloren gehen oder sich die Reihenfolge des Eingangs beim Empfänger ändern?

Ciao
Stefan
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
261 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Mehrfachen Schleifenaufruf verhindern

  Alt 9. Feb 2018, 07:24
Hallo,

In meinem Test kommen bei dem Beispiel die Zeichen der Reihe nach. Evtl. gibt es da noch code in OnChange welcher daran was ändert.

Ich habe auch Paint in OnChange probiert, das geht auch.

Im Unterschied zu SendMessage, schreibt PostMessage die meldung in die Message loop und kehrt dann zurück. Ob die Meldung verarbeitet wird und wann, bekommt der Aufrufer nicht mit.

SendMessage ruft den MessageHandler sofort auf und kehrt zurück, wenn fertig.

>> Ich denke hier wird eine TList mit den zu sendenden Messages und ein Thread der sich um das Versenden kümmert, die einzige saubere Lösung sein!<<

Das hört sich kompliziert an. Letztendlich geht es doch darum die Tabelle nach einer Änderung auszulesen, die geänderten Werte in eine Datenbank zu schreiben und Summen zu bilden. Muss man dies denn für jeden Wert der sich ändert machen?

Ich meine es reicht dies zeitnah nach der Änderung zu machen, oder wenn der Anweder das Feld verlässt, CR drückt o.ä. Dann allerdings muss man alle Werte auslesen und die geänderten zurückschreiben. Nur die aktuelle Zelle zu überwachen erscheint mir keine gute Idee.

Wenn man nicht Werte in die Datenbank schreiben will, die nicht geändert wurden, kann man eine Liste mit Zellen (IDs) anlegen in OnChange welche bearbeitet werden. Immer wenn die Update Prozedur an der Reihe ist, kann sie diese Liste durchgehen und abarbeiten. Aus einem anderen Thread wird das nicht gehen, da von diesem kein Zugriff in WPTools möglich ist.

WPTools ist zwar threadsave, aber nur wenn es nicht für den Eingabe Modus erstellt wurde. Siehe Beispiele zur threadsave PDF erstellung.

Ich bin jetzt auf jeden Fall für ein paar Tage schlecht zu erreichen, der vorliegende Quellcode sollte aber einige Hilfestellungen bieten.

Grüsse,
Julian
WPCubed GmbH
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
607 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Mehrfachen Schleifenaufruf verhindern

  Alt 9. Feb 2018, 07:53
Hallo Julian,

Es macht schon einen Unterschied ob ich per Code ein Zeichen anfüge oder ein Tastendruck dieses Zeichen anfügt...
Was Deine Variante mit Datenbank betrifft, das geht in meinem Fall nicht, vielleicht zur Erläuterung:

Die Tabelle ist wie in einer Papier-Rechnung, da kommen Zeilen mit Positionen (8 Spalten), Zeilen mit Zwischensummen (2 Spalten), Textzeilen (volle Tabellenbreite), Abschlusszeilen mit 4 Spalten (Mehrwertsteuer usw)...

Jetzt tippt der Benutzer in einer Position an der Menge herum, dies wird dem Hauptprogramm mitgeteilt und dieses muss
- den Preis der Position ändern
- alle nachfolgenden Zwischensummen ändern
- die Endsumme ändern
- ...

Oder der Benutzer löscht eine Position oder fügt eine neue ein, dann muss das Hauptprogramm daraufhin in allen folgenden Zeilen, wenn es da eine Positionsnummer gibt, diese aktualisieren und alle nachfolgenden Summenzeilen.

Nachdem ich aber jetzt konsequent alle Aktualisierungen gesperrt habe, bis die Messages verarbeitet sind, ist das Handling doch relativ flüssig geworden, auch ohne das tödliche Application.Processmessages

Ciao
Stefan
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:20 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