Lösung zu Fritz 11 Fehlermeldung

12. Mai 2018 - Lesezeit: 4 Minuten

In diesen Artikel geht es um die Fritz 11 Software von Chessbase. Dieser Fehler oder sagen wir Verhalten, kommt aber auch mit anderen Produkten die die GUI von Chessbase nutzen wie z.B. Shredder in einer belieben Version oder auch ältere Fritz Versionen ab 5.0!


Schachliebhaber haben verschiedene Engine’s. Und ab und zu macht man ein Engine Turnier.
Und wem ist diese Fehlermeldung noch nicht begegnet?

Beschreibung
--------------------------
Fehlermeldung: „X ist nicht definiert“
Wobei X hier für ein Engine Name steht. Mit dem bestätigen der Meldung bricht auch das Turnier wieder ab und die Fortsetzung des Turniers scheint erstmal hoffnungslos beendet zu sein.

Weiterlesen


LazReport und Textfelder

11. Mai 2018 - Lesezeit: 10 Minuten

Inhalt:

  • Text aus dem Skript ins Textfeld
  • Einsatz von mehreren Datenbankfelder im Textfeld
  • Einsatz eigener Variable im Skript eines Textfeldes

Weiterlesen


Lösungsmöglichkeiten Error: Incorrect token followed by „:“ (SQL)

10. Mai 2018 - Lesezeit: 2 Minuten

 

Sprachen: PHP, C++, Delphi,… alles womit man auf SQL Datenbanken zugreifen kann.

Dieser Artikel gibt einen kleinen Lösungsvorschlag zur Fehlermeldung:

„ Incorrect token followed by “:“ “ (wobei by auch ein anderes Zeichen sein kann)

Weiterlesen


[Pascal/Delphi] HTML entfernen - Geschwindigkeitstest mit verschiedenen Funktionen

9. Mai 2018 - Lesezeit: 7 Minuten

(Entstammt aus einen Forenbeitrag unter Delphipraxis. Hier die Zusammenfassung:)

 

Da viele Leute auf diese Funktionen hier zurückgreifen, möchte ich noch ergänzen.

Unter dem Geschwindigkeitsaspekt habe ich gemessen:

dwStrips benötigte im Durchschnitt 77,6 ms
StripTags benötigte im Durchschnitt 56,3 ms
CleanHTMLTags benötigte im Durchschnitt 4,6 ms

Für kleinere Anwendungen oder wenigen Anrufen spielt es keine Rolle welche Funktion man nimmt. Möchte man aber größere Texte, öfters Texte durchlaufen lassen sollte man CleanHTMLTags nehmen. dwStrips zieht sich schnell in die Länge.
 

Weiterlesen


[Pascal/Delphi] Fehlersuche bei steigenden Arbeitsspeicher Run Time Error 223

8. Mai 2018 - Lesezeit: ~1 Minute

Mit StringList wird bei jedem .add etwas in den Speicher geschrieben. Mit .free gibt man den Speicher wieder frei.

ABER wenn der Arbeitsspeicher trotzdem weiter ansteigt, hat man entweder ein .free vergessen oder etwas übersehen.

Wenn ein .free in einer Funktion gemacht wurde, zuvor aber eine Bedingung gemacht wurde z. B:

if (x = y) then exit;

Und das .free danach niemals aufgerufen wird... steigt der Speicher an. Besonders dramatisch wird soetwas, wenn man solch eine Funktion in einer Schleife durchlaufen lässt. Weil dann können schnell aus wenigen KB mehrere hundert MB werden.

Deshalb:

Bei .create's nach .free's suchen und zusätzlich nach vorzeitigen "exit" prüfen evtl. auch nach "break"/"continue" u. ä. !!

Bei dynamischen Arrays kann ich mir ein ganz ähnliches Problem vorstellen.

Wenn man das richtig gemacht hat, durfte das Programm je nach Ablauf keinen dauerhaft steigenden Arbeitsspeicher verursachen, wobei Schwankungen nach oben und unten (!) möglich sind.

Sinnvoll scheint hier auch die konstante Anwendung von

try and finally zu sein, um dieses Problem zu vermeiden (im finally Bereich dann ein x.free.).


Lazarus mit Packages erneut installieren

7. Mai 2018 - Lesezeit: ~1 Minute

(Dieser Artikel ist eine Zusammenfassung eines meiner Beiträge aus einem Internetforum)

Wie man eine bestehende Lazarus Packages auf einen neuen Rechner überträgt (oder erneut aufspielen möchte); Ohne die nervenaufreibende einzelne Installation der Packages.

Beschrieben für Win 7:

- Zuerst natürlich den normalen Lazarus Ordner mit IDE usw. auf die neue Platte oder Laufwerk kopieren.

- Den alten Ordner primary config path (hier zu finden C:\Users\USERNAME\AppData\Local\lazarus) auf Laufwerk C habe ich gefunden und auf den neuen kopiert (am besten selbst per Hand anlegen, falls nicht vorhanden. Wurde Lazarus zuvor mal gestartet, erstellt Lazarus den Ordner).

- Die Pfade habe ich mit lazarus.exe -setup geändert.

- Und danach im fpc Verzeichnis noch die Pfade in der fpc.cfg auf den neuen Laufwerksbuchstaben geändert. (Tipp: In Notepad mit Suchen & Ersetzen arbeiten! Backup von der Datei jedoch vorher machen für den Fall der Fälle)

Danach Lazarus samt aller Packages starten und das Projekt erfolgreich compilieren.

 


[Pascal/Delphi/Sqlite3/Zeos] Kleiner Geschwindigkeitstest von Insert

6. Mai 2018 - Lesezeit: 14 Minuten

Mich hat es interessiert, wie sich die Geschwindigkeiten von

Inserts bei SQLite3 und Zeos

verändern, mit unterschiedlichen "schreibweisen"; Und habe festgestellt, dass es durchaus erhebliche Unterschiede geben kann.

 


Ich habe den Test mehrmals durchlaufen, auch mit unterschiedlichen Zahlen und habe folgende Durchschnittszeiten bekommen:

Hier die sortierte Ergebnisse:

Benötigte Zeit % |  Funktionsname
48,57                  Test2 (Insert mit .add(Format(... siehe auch Test5 )                
17,62                  Test1 (Insert und exec... direkt hintereinander)
16,88                  Test8 (Wie Test7 + Prepare)
16,46                  Test7 (Nur ParamByName in Schleife)
0,22                   Test4 (Insert; in Transaction, außerhalb der Schleife)
0,21                   Test3 (Insert; in Transaction, innerhalb der Funktion)
0,03                   Test9 (wie 8 + Transaction)
0,01                   Test6 (Wie Test5 mit Transaction)
0,01                   Test5 (Direkt, Ohne .ParamByName.)



17,62                  Test1 (Insert und exec... direkt hintereinander)
48,57                  Test2 (Insert mit .add(Format(... siehe auch Test5 )                
0,21                   Test3 (Insert; in Transaction, innerhalb der Funktion)
0,22                   Test4 (Insert; in Transaction, außerhalb der Schleife)
0,01                   Test5 (Direkt, Ohne .ParamByName.)
0,01                   Test6 (Wie Test5 mit Transaction)
16,46                  Test7 (Nur ParamByName in Schleife)
16,88                  Test8 (Wie Test7 + Prepare)
0,03                   Test9 (wie 8 + Transaction)

 

(Funktion 2 hat im Test nicht teilgenommen. Ich war der Annahme, es ist auch mögliche mehrere Inserts mit add zu schreiben, doch das ist so nicht möglich.)

Hier die verschiedene Abschnitte:

 


function test1(testzahl: integer): string;
var
  a: integer;
begin
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.Text := 'Insert into daten2 (zahl) values (:zahl)';
    Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
    Form1.ZQuery1.ExecSQL;
  end;
end;



function test2(testzahl: integer): string; //nahpets
var
  a: integer;
begin

  Form1.ZQuery1.SQL.Clear;
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.add(Format('Insert into daten2 (zahl) values (%d);', [a]));
  end;
  Form1.ZQuery1.ExecSQL;

end;


function test3(testzahl: integer): string;
var
  a: integer;
begin
  Form1.ZQuery1.SQL.Text := 'begin transaction;';
  Form1.ZQuery1.ExecSQL;

  Form1.ZQuery1.SQL.Text := '';
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.Text := 'Insert into daten2 (zahl) values (:zahl);';
    Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
    Form1.ZQuery1.ExecSQL;
  end;


  Form1.ZQuery1.SQL.Text := 'Commit;';
  Form1.ZQuery1.ExecSQL;
end;




function test4(testzahl: integer): string;
var
  a: integer;
begin

  Form1.ZQuery1.SQL.Text := '';
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.Text := 'Insert into daten2 (zahl) values (:zahl);';
    Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
    Form1.ZQuery1.ExecSQL;
  end;

end;



function test5(testzahl: integer): string; //mensch72
var
  a: integer;
begin

  Form1.ZQuery1.SQL.Clear;
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.Text := 'Insert into daten2 (zahl) values (' + IntToStr(a) + ')';
  end;
  Form1.ZQuery1.ExecSQL;

end;


function test6(testzahl: integer): string;
var
  a: integer;
begin
   Form1.ZQuery1.SQL.Text := 'begin transaction;';
  Form1.ZQuery1.ExecSQL;

  Form1.ZQuery1.SQL.Clear;
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.Text := 'Insert into daten2 (zahl) values (' + IntToStr(a) + ')';
  end;
  Form1.ZQuery1.ExecSQL;

  Form1.ZQuery1.SQL.Text := 'Commit;';
  Form1.ZQuery1.ExecSQL;

end;



function test7(testzahl: integer): string;
var
  a: integer;
begin
  Form1.ZQuery1.SQL.text := 'Insert into daten2 (zahl) values (:zahl);';

  for a := 1 to testzahl do begin
      Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
      Form1.ZQuery1.ExecSQL;
  end;

end;

function test8(testzahl: integer): string;
var
  a: integer;
begin
  Form1.ZQuery1.SQL.text := 'Insert into daten2 (zahl) values (:zahl);';
  Form1.ZQuery1.Prepare;

  for a := 1 to testzahl do begin
      Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
      Form1.ZQuery1.ExecSQL;
  end;
end;



function test9(testzahl: integer): string;
var
  a: integer;
begin
  Form1.ZQuery1.SQL.Text := 'begin transaction;';
 Form1.ZQuery1.ExecSQL;

  Form1.ZQuery1.SQL.text := 'Insert into daten2 (zahl) values (:zahl);';
  Form1.ZQuery1.Prepare;

  for a := 1 to testzahl do begin
      Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
      Form1.ZQuery1.ExecSQL;
  end;

  Form1.ZQuery1.SQL.Text := 'Commit;';
 Form1.ZQuery1.ExecSQL;
 
 
 
 //Starts....

  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test1(testzahl);

  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test2(testzahl);

  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test3(testzahl);



  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  Form1.ZQuery1.SQL.Text := 'begin transaction;';
  Form1.ZQuery1.ExecSQL;
  test4(testzahl);
  Form1.ZQuery1.SQL.Text := 'Commit;';
  Form1.ZQuery1.ExecSQL;


  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test5(testzahl);


  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test6(testzahl);


  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test7(testzahl);


  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test8(testzahl);


  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test9(testzahl);

 

Test2,1,8,7: Sind deutlich langsam. Sollte man so keinesfalls verwenden, wenn Geschwindigkeit ein Kriterium sein soll.
Nur ParamByName in der schleife (Test7) ergibt für sich keinen Geschwindigkeitsvorteil, auch nicht mit Prepare verbunden (Test8); Und ergibt nur Sinn, wenn man diese mit Transaction verbindet (Test9). Mit Format() (Test2) sollte man bzgl. Schnelligkeit eher vorsichtig sein, diese war sogar fast dreimal solangsam wie Test1 (Insert,Exec direkt hintereinander).


Test3,4: Insert mit Transactionen gehen bereits erheblich schneller und können/sollten verwendet werden. Dabei spielt es keine Rolle ob "begin transaction / commit) innerhalb der Funktion oder außerhalb ist.

Test9,6,5: Sind nochmal um ca. 0,2 % schneller als Test3 und 4. Variablen direkt in die SQL Anweisung zu schreiben (Test5), war das schnellste; Gleiches mit Transaction (Test6) ist sogar einen Tick langsamer und wird nicht wirklich benötigt.

 

 

 


Auto Update for Plugins and Themes V1.1 03/18

21. März 2018 - Lesezeit: 4 Minuten

Installiert automatisch die aktuelle Bludit version, Plugins und Themes, die auf der Bludit Seite angeboten werden.

Download: [Nicht mehr verfügbar]

Auto Update wird nicht mehr weiterentwickelt. Siehe nach Update Modul.

Weiterlesen