Delphi-Programmierung

Delphi beliebte Fehler: TfrxReport -TfrxMasterData

In meinem Programm erstelle iche eine TfrxMasterData und trage dazu einige TfrxMemoView ein. Obwohl im Workspace alles richtig angezeigt wurde, waren die TfrxMemoView nicht dem TfrxMasterData zugeordnet,

Falsch default alt. text

Der Fehler lag darin, dass ich der TfrxMasterData keine Weite zugeodnet hatte. So wurde die TfrxMasterData zwar im Workspace richtig angezeigt, aber die TfrxMemoView konnten einer TfrxMasterData nicht zugeordnet werden.

function TfmEinfacherFastReportDesigner.EinfacheTabelle_Masterdata(
  aPage: TfrxReportPage; var aTop, aHeight: extended): TfrxMasterData;
begin
  Result := TfrxMasterData.Create(aPage);
  Result.CreateUniqueName;
  Result.Left:=0;
  Result.Width := 750; //Width darf nicht 0 sein.
  Result.Top := aTop;
  Result.Height := aHeight;
  Result.DataSet := dsTabelle;
end;

Richtig default alt. text

Delphi 10 - Icon fehlt

Mein Projekt konnte ich (fast) ohne Schwierigkeiten von Delphi 2009 nach Delphi 10 umsetzen. Nur fehlten plötzlich in den Formularen das Icon in der oberen linken Ecke.

default alt. text

Die Fehlersuche war aufwändig aber von Erfolg gekrönt.

In einer RES-Datei einer meiner selbst geschriebenen Komponenten war neben den BITMAPs auch ein verstümmelter Eintrag für ein ICON.

Mit Hilfe des Tools Resourcehacker konnte ich die RES-Datei reparieren.

  • Action – „Save Bitmap-Group to a RES-File“
default alt. text

Delphi beliebte Fehler: Delphi 10 - Debugging funktioniert nicht

Das ist aber eine böse Falle für Umsteiger von Delphi 2009 auf Delphi 10 Seattle:

Wenn das Programm in der IDE mit dem grünen Pfeil gestartet wird, sollte man vorher den Hinweis lesen „Ohne Debugger ausführen“.

Um das Programm in der IDE mit Debugger zu starten die Taste F9 benutzen oder diesen Schalter

default alt. text

Delphi beliebte Fehler: Grid auf einem Formular erhält nicht den Focus

Das Problem:

Ein Eingabedialog wird mit Showmodal aufgerufen und das Grid im Eingabedialog erhält nicht den Fokus und ist auch mit der Maus nicht anklickbar.

Die Lösung

Schuld war der Aufruf des Eingabedialogs im Hauptformular der Anwendung bereits im OnFormActivate Ereignis, ohne der Anwendung Zeit zu geben alle bis dahin anstehenden Ereignisse abzuarbeiten.

procedure Tam_Main.FormActivate(Sender: TObject);
begin
  // Der Anwendung Zeit geben, alle bisher anstehenden Ereignisse abzuarbeiten.
  Application.ProcessMessages;
  am_Eingabe.Execute;
end;

Delphi beliebte Fehler: "Ungültige Zeigeroperation" bei Close eines Forms

Beim Schließen eine Formulars, an dem ich schon seit Monaten keine Änderungen vorgenommen hatte, gab es plötzlich eine Schutzrechtsver­letzung.

Nach mehreren Stunden Suche habe ich den Fehler gefunden.

Auf dem Formular gibt es eine TpFIBDataSet. Zu dieser TpFIBDataSet hatte ich neben anderen Feldern ein TStringField zugewiesen. (Weiß der Geier warum ich das mal gemacht hatte.) Nach einem Update der FIB-Komponenten auf die Version 7.51.2676 wurde das TStringfield beim Schließen des Formulars nicht mehr mit freigegeben und verursachte den Fehler „Ungültige Zeigeroperation“.

Abhilfe: Das Feld löschen und als TFIBStringfield wieder anlegen.

Delphi beliebte Fehler: Runtime Error 216

Der Fehler Runtime Error 216 tritt auf, wenn das Programm beendet wird und es Fehler beim Abbau der Forms gibt.

Kontrollieren ob in der FormDestroy Methode das Formular auf nil gesetzt wurde.

type Tam_Form = class(TForm)  
    procedure FormDestroy(Sender: TObject);  
  end;  

function am_Form: Tam_Form;  
procedure am_Form_FreeAndNil;  

implementation  

{$R *.dfm}  

var  
  Form: Tam_Form;  

function am_Form: Tam_Form;  
begin  
  if Form = nil then  
    Form := Tam_Form.Create(Application);  
  Result := Form;  
end;  

procedure am_Form_FreeAndNil;  
begin  
  if Form <> nil then  
    FreeAndNil(Form);  
end;  


{ Tam_Form }  

procedure Tam_Form.FormDestroy(Sender: TObject);  
begin  
  inherited;  
  Form := nil;  
end;  

initialization  
  Form := nil;  
finalization  
  am_Form_FreeAndNil;  
end.  

Delphi 7 - FileExists - und alte Dateien

Fileexists liefert für Dateien, die älter sind als Delphi 7 erlaubt (also vor dem 01.01.1970) den Wert FALSE.

function FileExists(const FileName: string): Boolean;  
{$IFDEF MSWINDOWS}  
begin  
  Result := FileAge(FileName) <> -1;  
end;  
{$ENDIF}  

function FileAge(const FileName: string): Integer;  
{$IFDEF MSWINDOWS}  
var  
  Handle: THandle;  
  FindData: TWin32FindData;  
  LocalFileTime: TFileTime;  
begin  
  Handle := FindFirstFile(PChar(FileName), FindData);  
  if Handle <> INVALID_HANDLE_VALUE then  
  begin  
    Windows.FindClose(Handle);  
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then  
    begin  
      FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);  
      if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,  
        LongRec(Result).Lo) then Exit;  
    end;  
  end;  
  Result := -1;  
end;  
{$ENDIF}  

Die Datei ist ein Foto und wurde von einer Kamera mit dem Datum 0 aufgenommen:

In den EXIF-Daten steht das Datum 01.01.1970

Das Dateidatum ist:

$ ls -l  
-rw-r--r-- 1 wnf wnf 2815785 Nov 25  1961 PICT0003.JPG  

Win7 & Delphi7

nachdem nun immer mehr Programme die Zusammenarbeit mit W2K verweigern, ist es an der Zeit mit der Entwicklungsumgebung auf eine Win7 Maschine umzuziehen.

1) Delphi 7 installieren (Ohne Interbase Client und ohne Rave)
1) Delphi 7 das erste Mal als Administrator starten und wieder beenden
1) Für den Ordner und alle Unterordner den Schreibschutz aufheben: c:\Program Files\Borland\Delphi7\Bin\
1) Delphi registrieren per Internet (Obwohl es schon sehr alt ist funktioniert die Registrierung noch)
1) Das Servicepack installieren d7_de_pro_upd1_1.exe
1) Das Rave Update installieren rave_be_5_0_8.exe
1) DelForEx installieren
1) Delphi starten
1) GExpert -Configuration

  • Perfect Layout einschalten
  • IDE konfigurieren
    1) Tools - Umgebungsoptionen

  • Umgebungsvariablen für Verzeichnisse kauf,dsp,lwnf anlegen

  • Bibliothek - diverse Bibliothekspfade anlegen
    1) Tools - Debuggeroptionen

  • Sprachexceptions EFIBInterbaseError hinzufügen

  • Bei Delphi-Exceptions stoppen auschalten
    1) Packages installieren
    1) kauf_lib\kauf_lib.bgb
    1) kauf_lib\DevExpress5\DevExpress5.bpg
    1) kauf_lib\xls_mini.dpk
    1) dsp_lib\dsp.bgp
    Dabei beachten: Für jede BPL-Datei muss das Ausgabe verzeichnis der Units auf ..\ bzw. ....\ gesetzt werden, so dass die *.dcu Dateien im Verzeichnis kauf_lib abgelegt werden.
    1) Anpassungen an dcc.cfg in den Projektverzeichnissen vornehmen.
-aWinTypes=Windows;WinProcs=Windows;DbiProcs=BDE;DbiTypes=BDE;DbiErrs=BDE  
-u"C:\Programme\Borland\Delphi7\lib";"C:\Programme\Borland\Delphi7\lib\Obj"  
-u"c:\Programme\Borland\Delphi7\Rave5\Lib\"  
-u"C:\wnf\dl7\dsp_lib"  
-u"C:\wnf\dl7\dsp_lib\SynEdit"  
-u"C:\wnf\dl7\dsp_lib\ML_LIB"  
-u"C:\wnf\dl7\dsp_lib\dspFIB"  
-u"C:\wnf\dl7\dsp_lib\Lizenz"  
-u"C:\wnf\dl7\dsp_lib\rppro"  
-u"C:\wnf\dl7\kauf_lib"  
-u"C:\wnf\dl7\kauf_lib\DevExpress5"  
-u"C:\wnf\dl7\wnf_tools"  
-u"C:\wnf\dl7\wnf_vcl"  
-i"C:\wnf\dl7\wnf_tools"  
-lu"vcl;rtl;vclx;dbrtl;vcldb;vcldbx;"  
-w-UNSAFE_TYPE  
-w-UNSAFE_CODE  
-w-UNSAFE_CAST  
-w-SYMBOL_PLATFORM  
-w-UNIT_PLATFORM  

Delphi Firemonkey

Hier einige Antworten aus dem Embarcadero Webinar zu Firemonkey im September 2011

(Das ist nur ein Auszug, der für mich wichtigen Fragen und Antworten)


XXX-|Q:|Are there plans or efforts in the works to provide FireMonkey support on Linux and Android?

|A:| Both of these platforms are on the roadmap.

XXX-|Q:| What data based controls are available in FM?

|A:| Most FireMonkey visual controls can be bound to data, objects and expressions using our new LiveBindings technology.

XXX-|Q:| What can the ClientDataSet bind to?

|A:| FireMonkey includes built-in component based access to MS SQL Server, Oracle, IBM DB2, MySQL, Sybase, Informix, InterBase and Firebird databases. And of course, FireMonkey's data access is native which offers high performance. Detailed feature matrices are available at: www.embarcadero.com/products/rad-studio

XXX-|Q:| Can I compile a 64 bit application on a 32 bit Delphi XE2 (installed on a 32 bit machine)?

|A:| Yes, you can build 64-bit applications using a 32-bit machine. However, you won’t be able to test them unless you use the Platform Assistant running on a 64-bit Windows machine or deploy the application to a Win64 machine.

XXX-|Q:| Is there a solution for reports/printing in FireMonkey?

|A:| There is currently no reporting solution available in FireMonkey.

XXX-|Q:| Does FireMonkey have TWebBrowser

|A:| An equivalent FireMonkey control is not available in this release.

XXX-|Q:| I read in a blog that TActionList is not available in FM. Is that true? Any plans to add it?

|A:| That is correct, but it is being considered for the roadmap.

XXX-|Q:|If all the code is standard VCL code is should port with little to no issues, correct?

|A:|Much of your application logic should be portable. However, user interfaces will need to be recreated with FireMonkey Forms and Controls. For migrating VCL forms to FireMonkey – check out Jeff Lefebvre’s blog post about MonkeyGroomer

XXX-|Q:| Will support for Windows 8 Metro Style apps be available in the next major version of Delphi, depending when Windows 8 is actually released?
|A:| No announcement has been made for Windows 8 Metro Style apps in a particular version of Delphi.

Seiten