Entw.: Python für Delphi

Seit 2015 wurde die bestehende Python4Delphi-API (P4D) nicht an neuere Delphi-Versionen angepasst. Insbesondere die Datenbank-Funktionalität bedurfte einer Anpassung an FireDac. Hier finden Sie eine neuere Python4Delphi-Version mit einer FireDac-Unit. Sie wurde unter Delphi 10.2 (Tokyo) weiterentwickelt und unter Win64-Bedingungen getestet. Diese P4D-Version verwende ich auch zum schnelleren Prototyping von Tensorflow-Python-Skripten.

Anforderungen

  • Delphi 10.2 (Tokyo) oder höher
  • → Das Package SynEdit for VCL ist mit GetIt in die Delphi-IDE zu integrieren.
  • → Installation von Python 3.6 als Win64-Version
  • → Möchte man nach Python hinein debuggen, so ist die DLL-Datei python36_d.dll notwendig. Dazu sind die Python-Sourcen neu mit Debug zu kompilieren.

Durch die Verwendung von FireDAC werden viele Datenbanken unterstützt. Das folgende Bild zeigt die Architektur von FireDAC. Die Python-Skripte können somit direkt auf diese Datenbanken zugreifen.

FireDACFireDAC

Quelle: Embarcadero


Das untere Python-Skript zeigt ein Beispiel eines Datenbankzugriffs über die FireDac-Implementierung:

import DBFireDac
from datetime import datetime

# Get the TTable object associated to
# the delphi table displayed on right
# It is done when you click on Execute
T = DBFireDac.T

# Display columns
print ("Columns: ")
for i in T.FieldNamesAsTuple():
  print ("   ", i)

# For each record of the table
print ("Company name for each record of table : ")
T.First()
while not T.EOF:
  # Print the current record number and the Company
  print ("Rec.", T.RecNo, "; Company: ", T.FieldByName("Company").Value)
  # Get next record
  T.Next()

# check state
if not T.State in [DBFireDac.dsEdit, DBFireDac.dsInsert]:
  print ("Table is not edited")

# Find and edit a record
T.IndexName = "SK1_CUSTOMER"
if T.FindKey( ['Unisco'] ):
  print ("Unisco found !")
  T.Edit()
  T.FieldByName('ADDR2').AsString = 'Egal'
  T.FieldByName('LASTINVOICEDATE').AsDateTime = datetime.today()
  T.Post()
  print ("New values for ADDR2='", T.FieldByName('ADDR2').AsString, "'and LASTINVOICEDATE=", T.FieldByName('LASTINVOICEDATE').AsString)
else:
  print ("Could not find Unisco !")

# New Company: Append or Delete
if T.FindKey( ['Test-Company'] ):
  # Delete record
  T.Delete()
  print ("New Company 'Test-Company' deleted !")
else:
  # New record
  T.Append()  
  T.FieldByName('COMPANY').AsString = 'Test-Company'
  T.FieldByName('ADDR1').AsString = 'Marktplatz 1'
  T.FieldByName('CITY').AsString = 'Köln'
  T.FieldByName('LASTINVOICEDATE').AsDateTime = datetime.today()
  T.Post()
  print ("New Company 'Test-Company' created !")

Die Sourcen der geänderten Python4Delphi-API finden Sie in meiner Github-Repository .