Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi TMemo (FireMonkey) (https://www.delphipraxis.net/178791-tmemo-firemonkey.html)

value is NULL 28. Jan 2014 08:34

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

value is NULL 28. Jan 2014 09:12

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;

Der schöne Günther 28. Jan 2014 09:39

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?

value is NULL 28. Jan 2014 09:51

AW: TMemo (FireMonkey)
 
Im Endeffekt rufe ich aus einem Thread verschiedene prozeduren auf:

Delphi-Quellcode:
...

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;
Habe jetzt auch versucht weniger auszugeben sprich ich habe die Write's in der While loop entfernt...
Selber Effekt :/

Der schöne Günther 28. Jan 2014 10:01

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:
TThread.Queue(..)
oder
Delphi-Quellcode:
TThread.Synchronize(..)
in den Hauptthread verlagerst flackert nichts und alles läuft schön flüssig durch.

value is NULL 28. Jan 2014 10:09

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:

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);
und aus "importhread" rufe ich dann die Funktionen auf. Wie könnte sowas aussehen mit Synchronize?

Danke jetzt schon mal und liebe Grüße!

value is NULL 28. Jan 2014 10:34

AW: TMemo (FireMonkey)
 
vergiss es... ich lese mich selbst da ein :)

Danke auf jeden Fall!

Der schöne Günther 28. Jan 2014 11:33

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:
TThread
-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. :-)

value is NULL 28. Jan 2014 11:46

AW: TMemo (FireMonkey)
 
Ich hab mir da jetzt einiges angesehen werde da aber nicht unbedingt schlau :/

zB

Delphi-Quellcode:
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;
Wie würde ich hier zB meine "write" funktion einbauen ? Synchronize kann ja nicht mit Parametern umgehen soviel ich weiß oder?

himitsu 28. Jan 2014 11:51

AW: TMemo (FireMonkey)
 
Zitat:

Delphi-Quellcode:
if Result <> Null then

Das ist immer ungleich NULL. :roll:

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:26 Uhr.
Seite 1 von 2  1 2      

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