![]() |
TMemo (FireMonkey)
Hi Liebe Community
ich suche mindestens schon seit 2 Stunden im Netzt und habe auch echt schon viel versucht. Ich habe eine FireMonkey App für Metro UI erstellt. Auf dieses Form habe ich mir ein Memo platziert welches ich als "Live Log" nutze. Sprich mein Programm führt diverse Schritte durch und schreibt diversen Text in das Memo, damit der Benutzer auch sieht was da passiert. Jedoch flackert das Teil wie sau. Ich habe die Applikation vorher in der XE geschrieben und dort hat auch alles funktioniert. Jetzt wollte ich dem Ding ein neues UI mit dem neueren Look. Habe schon viel versucht: - Memo ersetzt durch ListBox - BeginUpdate und EndUpdate - DoubleBuffered habe ich leider nich gefunden obwohl ich das Memo auf ein TPanel gelegt habe usw usw Ich komme echt nicht weiter aber das flackert echt extrem. Für Tipps jeglicher Art bin ich dankbar! LG PS Ich benutze jetzt Delphi XE5 Architect |
AW: TMemo (FireMonkey)
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe ein Video beigefügt wie sich das ganze äußert.
hier mein code welchen ich für das Memo verwende:
Delphi-Quellcode:
Form1.Memo1.Lines.BeginUpdate;
try Form1.Memo1.Lines.Add(DateToStr(Now)+' '+TimeToStr(Now)+' '+msg); finally Form1.Memo1.Lines.EndUpdate; end; |
AW: TMemo (FireMonkey)
Kann ich spontan auf XE5 nicht nachstellen - Alle 200ms etwas in eine Memo werfen. Kannst du vom Code her nicht ein Minimalbeispiel einstellen?
|
AW: TMemo (FireMonkey)
Im Endeffekt rufe ich aus einem Thread verschiedene prozeduren auf:
Delphi-Quellcode:
Habe jetzt auch versucht weniger auszugeben sprich ich habe die Write's in der While loop entfernt...
...
function write(msg : string) : string; begin Form1.Memo1.Lines.BeginUpdate; try Form1.Memo1.Lines.Add(DateToStr(Now)+' '+TimeToStr(Now)+' '+msg); finally Form1.Memo1.Lines.EndUpdate; end; end; .... function RightsThread() : string; var groups, idprivs : TStringlist; i,i2 : Integer; idRole, right, prefix : String; begin result := 'ok'; write('[RIGHTS] Thread started'); //SQL Connection write(' - Connecting to Database ...'); if sqlst.connect_extdb('127.0.0.1', 'test', 'test', 'mainDB') <> 'OK' then begin write(' - ERROR: Cannot connect to Database'); write(sqlst.assert); result := 'error'; abort; end; write(' - SQL Connection established'); //prefix if Form1.Switch1.IsChecked then prefix := 'v3_' else prefix := ''; Write('- Reading Groups...'); groups := TStringlist.Create; sqlst.DoQuery('select name from tbrole', groups); i := 0; if groups.Count < 1 then begin write(' - ERROR: No Group(s) found. [GroupThread] finished'); result := 'error'; abort; end; idprivs := TStringlist.Create; //Start it Writeln(x, ' <!-- Define Group and Access Rights -->'); while i < groups.Count do begin write(' - Processing Group '+groups[i]); Writeln(x, ' <group name="'+prefix+groups[i]+'" enabled="true"/>'); Writeln(x, ' <groupRegion group="'+prefix+groups[i]+'" region="Standard"/>'); //Start Reading Access Rights idRole := sqlst.query('select idrole from tbrole where name = '''+groups[i]+''''); if idRole = '' then begin write(' - ERROR: IDRole not found for '+groups[i]); abort; end; //Read all rights sqlst.DoQuery('select idpriv from tbuserright where idrole = '+idrole+' and extra is NULL', idprivs); Write(' - '+inttostr(idprivs.Count)+' Userright(s) found for group '+groups[i]); i2 := 0; while i2 < idprivs.Count do begin right := sqlst.query('select name from tbpriv where idpriv = '+idprivs[i2]); right := convert_userright(right); if right = 'unknown' then goto next; Writeln(x, ' <accessRight group="'+prefix+groups[i]+'" accessRight="'+right+'"/>'); Write('Added Right '+right); next: i2 := i2 + 1; end; i := i + 1; idprivs.Clear; Writeln(x, ''); end; sqlst.close; groups.Free; idprivs.Free; end; Selber Effekt :/ |
AW: TMemo (FireMonkey)
Ja, ein Wunder das das Ding sich nicht aufhängt sondern tapfer weiterläuft. Aus einem Thread heraus - wie immer - nicht direkt die Oberfläche (im Hauptthread) anfassen! Wenn ich das bei mir tue, flackert es auch wie wild.
Wenn du das Anfügen in der Memo wieder mit
Delphi-Quellcode:
oder
TThread.Queue(..)
Delphi-Quellcode:
in den Hauptthread verlagerst flackert nichts und alles läuft schön flüssig durch.
TThread.Synchronize(..)
|
AW: TMemo (FireMonkey)
Mann Mann Mann....
DANKE! Vermutlich blöde Frage, habe mich mit Threads nie so auseinander gesetzt. Ich benutze dies hier zum starten meines Threads
Delphi-Quellcode:
und aus "importhread" rufe ich dann die Funktionen auf. Wie könnte sowas aussehen mit Synchronize?Function StartThread(pFunction : TFNThreadStartRoutine; iPriority : Integer = Thread_Priority_Normal; iStartFlag : Integer = 0) : THandle; var ThreadID : DWORD; begin Result := CreateThread(nil, 0, pFunction, nil, iStartFlag, ThreadID); if Result <> Null then SetThreadPriority(Result, iPriority); end; ... ithread := StartThread(@importThread); Danke jetzt schon mal und liebe Grüße! |
AW: TMemo (FireMonkey)
vergiss es... ich lese mich selbst da ein :)
Danke auf jeden Fall! |
AW: TMemo (FireMonkey)
In der VCL verhält es sich übrigens genauso. Ich glaube da wäre das Programm schon längst aufgehangen. Ein Wunder, das das überhaupt funktioniert hat ;-)
Hinweis: Ich hatte im Delphi-Land persönlich noch nie einen Grund, Threads hart über die Windows-API zu regeln. Es sei denn, man steht auf körperliche Schmerzen. Ich finde den Weg über die
Delphi-Quellcode:
-Klasse (in System.Classes) eigentlich sehr, sehr angenehm gemacht. Ein gutes Tutorial habe ich zwar nicht zur Hand, aber viel steckt da auch nicht hinter. :-)
TThread
|
AW: TMemo (FireMonkey)
Ich hab mir da jetzt einiges angesehen werde da aber nicht unbedingt schlau :/
zB
Delphi-Quellcode:
Wie würde ich hier zB meine "write" funktion einbauen ? Synchronize kann ja nicht mit Parametern umgehen soviel ich weiß oder?
type
TBinFertig = procedure(const Content: String) of object; TMyOwnThread = class(TThread) private FBinFertig: TBinFertig; procedure SyncBinFertig; public property BinFertig: TBinFertig read FBinFertig write FBinFertig; end; implementation procedure TMyOwnThread.SyncBinFertig; begin if Assigned(FBinFertig) then FBinFertig(DasIstDerInhaltDerWebseite); end; procedure TMyOwnThread.Execute; begin try // Download der Seite ... // Synchronisieren Synchronize(SyncBinFertig); except on e: exception do begin // mache hier irgendetwas mit dem Fehler. end; end; end; |
AW: TMemo (FireMonkey)
Zitat:
Du meintest wohl eher NIL, oder besser noch Assigned. PS: TThread auch das Execute schon mit einem Try-Except abgesichert, da das selten jemand abfängt und wenn eine Exception in irgendinem Thread bis zur Wurzel durchrauscht, dann schießt Windows die Anwendung komplett ab. TThread synchronisiert die letzten Events auch schon. OnTerminate anhängen oder DoTerminate überschreiben und darin hat man im FatalException dann die durchgerauschte Exception vom Execute. |
AW: TMemo (FireMonkey)
Wie schon gesagt, die Arbeit mit dem
Delphi-Quellcode:
brauchst du dir auch nicht mehr zu machen, genau dazu ist schon das
SyncBinFertig
Delphi-Quellcode:
-Ereignis da.
OnTerminate
Wir können das alles gerne nochmal Schritt für Schritt durchgehen, aber das hat ja dann mit dem (eigentlich gelösten) Problem mit der flackernden Memo nichts mehr zu tun. Da würde ich dann ein neues Thema vorschlagen. |
AW: TMemo (FireMonkey)
Da gebe ich dir recht! Danke habe ich schon erstellt!
LG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 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