Hallo Community,
mein erster Beitrag also...
Meine Kenntnisse in Delphi sind ansich mager, aber ich arbeite seit langem mit verschiedensten Programmiersprachen.
Umgebung
Ich schreibe ein
GUI zum Erstellen von Regeln zur automatischen Probenentnahme an einer Produktionsschiene.
Ca. 20 Parametern zum Kunden, Artikel und verwendeten Materialien halte ich hierzu in einer Oracle-Tabelle.
Unit1 sei somit meine Form zur Eingabe/Anzeige, Unit2 der Datencontainer ohne Methoden und Unit3 die Methoden, die z.B. zur Umwandelung von dem einen Record in den anderen Record zuständig sind.
Ich habe mich dazu entschieden, mit 2 Arten von Records zu arbeiten. Einer, der vergleichbare Variablen und Datentypen hat, wie die Oracle-Tabelle und einer, der auf die Felder des
GUI zugeschustert ist.
Demnach arbeite ich mit 2 Records: aus
DB einlesen (Typ1) und für
GUI aufarbeiten (Typ2).
Natürlich ist die ganze Sache etwas komplexer, aber da sehe ich mal keine Zusammenhänge zu meinem Problem.
Delphi-Quellcode:
(Unit2)
type TDbRegeln =
Record // Record mit Variablen und Formaten der DB-Tabelle
Probenart_Nr: Integer;
Probenart_Txt:
String;
(...)
Proben_Zaehler: Integer;
end;
Delphi-Quellcode:
(Unit2)
type TComboBoxList = array [0..7] of String; // Array für die 8 anzuzeigenden Elemente einer TComboBox
type TRegeln = record // Record mit Variablen und Formaten der Masken-Regeln
ProbenartNr: String;
ProbenartNrList: TComboBoxList;
ProbenartNrVer: String;
Aktiv: Boolean;
GrundAenderung: String;
ProbenartText: String;
(...)
Artikel: String;
ArtikelList: TComboBoxList;
StatusIndex: Integer;
Status: Integer;
UnsavedChanges: Boolean;
UnsavedChangesNr: Boolean;
UnsavedChangesNrVer: Boolean;
end;
Delphi-Quellcode:
(Unit2)
AktRegel: TRegeln;
LoadRegel: TDbRegeln;
Problem
In Unit1 werden zum FormCreate Initialwerte für AktRegel.* gesetzt. Eigentlich nur zum debuggen, da ich kurz darauf, immer noch im FormCreate via Devart's Oracle-Direct Schnittstelle die letzte aktive Regel in der Oracle-
DB abrufe und an LoadRegel.* übergebe.
Diese wird (Soweit ich das im Debugging verfolgen kann) auch korrekt in LoadRegel eingelesen. Anschließend werden die Daten in Unit3 "procedure DbRecordToDataset" aufbereitet zur Anzeige im
GUI und zeilenweise an AktRegel weitergegeben.
Den gesamten folgenden Code aus Unit3 kann ich im Debugger mit F8 ja ganz gut verfolgen und die Werte der Variablen, sowohl von LoadRegel.*, als auch die übergebenen Werte an AktRegel.* sind korrekt.
Nachdem allerdings die procedure durchgelaufen ist und zum Aufrufer (Unit1.FormCreate) zurückspringt, ist AktRegel wieder mit den Initialwerten gefüllt!
Was weiss ich da noch nicht?
(Unit1) procedure FormCreate
(Unit1) Initialwerte setzen
(Unit1) LoadRegel.* mit UniQuery-Daten füllen
(Unit1) Unit3.DbRecordToDataset aufrufen
(Unit3) LoadRegel.* verarbeiten zu AktRegel.*
(Unit3) Zurück zum Aufrufer Unit1.FormCreate
(Unit1) AktRegel.* ist wieder mit Initialwerten gefüllt
Delphi-Quellcode:
procedure DbRecordToDataset;
var
StrBba: String;
begin
AddListItem(AktRegel.ProbenartNrList, AktRegel.ProbenartNr); //Methode um die TComboBox-Listen zu füllen
AddListItem(AktRegel.ProbenartNrVerList, AktRegel.ProbenartNrVer);
AddListItem(AktRegel.ProbenZyklusList, AktRegel.ProbenZyklus);
AddListItem(AktRegel.WiederholenList, AktRegel.Wiederholen);
AddListItem(AktRegel.KundenNrList, AktRegel.KundenNr);
AddListItem(AktRegel.KundeList, AktRegel.Kunde);
AddListItem(AktRegel.SystemList, AktRegel.System);
AddListItem(AktRegel.MaterialList, AktRegel.Material);
AddListItem(AktRegel.ArtikelList, AktRegel.Artikel);
AktRegel.ProbenartNr := IntToStr(LoadRegel.Probenart_Nr);
AktRegel.ProbenartNrVer := COPY(IntToStr(LoadRegel.Probenart_Nr_Ver)
,(Length(IntToStr(LoadRegel.Probenart_Nr_Ver))-2),3);
AktRegel.ProbenartDatNeu := LoadRegel.Probenart_Dat_Neu;
AktRegel.ProbenartDatAender :=LoadRegel.Probenart_Dat_Aender;
AktRegel.GrundAenderung := LoadRegel.Grund_Aenderung;
AktRegel.AnzahlProben := IntToStr(LoadRegel.Anzahl_Tafeln);
AktRegel.ProbenZyklus := IntToStr(LoadRegel.Proben_Zyklus);
AktRegel.Wiederholen := IntToStr(LoadRegel.Wiederholen);
AktRegel.Bemerkung1 := LoadRegel.Bemerkungen_Zeile_1;
AktRegel.Bemerkung2 := LoadRegel.Bemerkungen_Zeile_2;
AktRegel.KundenNr := IntToStr(LoadRegel.Kunden_Nr);
AktRegel.DickeVon := (GetDickeDb(LoadRegel.Gesamt_Dicke_Von));
AktRegel.DickeBis := (GetDickeDb(LoadRegel.Gesamt_Dicke_Bis));
AktRegel.Material := IntToStr(LoadRegel.Material);
AktRegel.Artikel := IntToStr(LoadRegel.Artikel);
AktRegel.StatusIndex := GetStatus(LoadRegel.Artikel_Status);
AktRegel.DurchlaufIndex := GetDurchlaufIndex(LoadRegel.Durchlauf);
AktRegel.ProbenartTextIndex := GetProbenartTxt(LoadRegel.Probenart_Txt);
AktRegel.Kunde := GetCustomer(LoadRegel.Kunden_Nr);
AktRegel.VmArtIndex := GetVMaterial(LoadRegel.Vm_Art);
AktRegel.System := IntToStr(LoadRegel.System)
+ ' - '
+ GetSystem(LoadRegel.System);
AktRegel.UnsavedChangesNr := False;
AktRegel.UnsavedChangesNrVer := False;
AktRegel.UnsavedChanges := False;
StrBba:= AnsiUpperCase(TRIM(LoadRegel.Bba));
case AnsiIndexStr(StrBba,['3', '4']) of
0:begin
AktRegel.Bba3:=true;
AktRegel.Bba4:=false;
end;
1:begin
AktRegel.Bba4:=true;
AktRegel.Bba3:=false;
end;
else
begin
AktRegel.Bba4:=true;
AktRegel.Bba3:=true;
end;
AktRegel.Bba := StrToIntDef(LoadRegel.Bba,0);
end;
case LoadRegel.Regel_Aktiv of
0: AktRegel.Aktiv:= false;
else
AktRegel.Aktiv:= true;
end;
HinweisTextNeu('Datensatz '
+ AktRegel.ProbenartNr
+ ' v'
+ AktRegel.ProbenartNrVer
+ ' geladen');
end;
Danke für's lesen
und sonnige Grüße, Markus