Einzelnen Beitrag anzeigen

marfin777

Registriert seit: 23. Jul 2015
5 Beiträge
 
Delphi XE8 Professional
 
#1

Record, der überschrieben wird, bekommt wieder Initialwerte

  Alt 23. Jul 2015, 15:41
Delphi-Version: XE8
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
Markus
  Mit Zitat antworten Zitat