Schön, das ist jetzt besser.
Also: als erstes solltest du dein Projekt mit Debug-Einstellungen kompilieren, dann kannst du mit dem Debugger Breakpoints setzen und den aktuellen Wert von Variablen abfragen. Ohne dieses Tool, auch wenn viele über GDB schimpfen, bist du blind!
Dann zu deinem Problem:
Wenn ich zu Beginn von "TDM.Text_von_DB_umwandeln" Dummy-Variablen len := Length(Sender.AsString) und wlen := Length(Sender.AsWideString) definiere, einen Breakpoint auf der folgenden Zeile setze, das Programm starte und, wenn es am Breakpoint angehalten hat, mit der Maus über len und über wlen fahre, erscheint in dem Popup jedesmal der Wert 32. Da die Umlaute in UTF8 mit zwei Byte codiert sind, müssten die beiden Angaben voneinander abweichen, falls die aus der DB erhaltenenen Strings UTF8-kodiert wären. Daher sind die Strings entweder in der System-Codepage codiert, oder WideStrings. Da aber m.E. das alte Access per Default noch nicht mit WideStrings gearbeitet hat, tippe ich auf CodePage 1252 - d.h. du musst den per Sender.AsString ausgelesenen String mit CP1252ToUTF8 oder allgemeiner WinCPtoUTF8 nach UTF8 umwandeln.
An der Stelle mit dem Edit hast du
Code: Alles auswählen
frmPosition.Position_Edit.Text := unitDM.DM.SQLQueryPosition.FieldByName('Position').AsString
Offenbar wird hier beim einfachen Aufruf von Field.AsString nicht das Ereignis OnGetText erzeugt, so dass die String-Umwandlung fehlt. Entweder nimm hier von FieldByName('Position') den DisplayText, oder füge wieder eine explizite Umwandlung der CodePage um:
Code: Alles auswählen
frmPosition.Position_Edit.Text := unitDM.DM.SQLQueryPosition.FieldByName('Position').DisplayText;
//oder:
frmPosition.Position_Edit.Text := WinCPtoUTF8(unitDM.DM.SQLQueryPosition.FieldByName('Position').AsString);
Entsprechend musst du natürlich beim Zurückschreiben in das Feld die Rückumwandlung ausführen:
Code: Alles auswählen
unitDM.DM.SQLQueryPosition.FieldByName('Bezeichnung').Value := UTF8ToWinCP(frmPosition.Bezeichnung_Edit.Text);
In den Parametern, die du verwendest, um die ODBCConnection zu öffnen, verwendest du "ODBCConnection.Params.Add('CHARSET=UTF8')". Das ist offenbar wirkungslos, zumindest sehe ich keinen Unterschied, wenn man das entfernt, oder ändert. Daher würde ich das entfernen - es führt nur zur Verwirrung, falls du später den Code wieder siehst und alle Details vergessen hast.