Einzelnen Beitrag anzeigen

BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

Texteigenschaft einer Komponente wird nicht mehr gesetzt

  Alt 29. Mai 2009, 13:46
Hallo und guten Tag an alle DP´ler,

Hab mal wieder ein Problem mit einer meiner Komponenten. Das komische ist, wenn ich beim Erzeugen der Komponente auf die Text-Eigenschaft zugreife, wird diese ohne Probleme gesetzt. Wenn ich aber zu einem späteren Zeitpunkt darauf zugreife nicht mehr. Warum?

Hier mal die, wie ich meine, entscheidenden Quellcodezeilen. Als erstes die Initialisierung in der Hauptform:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  Datenbank := TDatenbankoberflaeche.Create(Self);
  Datenbank.Parent := Self;
  Datenbank.Left := 10;
  Datenbank.Top := 10;
  Datenbank.Initialisieren;
end;
Die create-Fkt der Komponente:
Delphi-Quellcode:
function TDatenBankoberflaeche.CreateLabZahlEditEinheit(PosX: Integer; PosY: Integer; Width: Integer;
  Height: Integer; Textgroesse: Integer; Index: integer): TLabZahlEditEinheit;
begin
  result := TLabZahlEditEinheit.Create(nil);
  result.Parent := Self;
  result.Left := PosX;
  result.Top := PosY;
  result.Height := Height;
  result.Font.Size := Textgroesse;
  result.Font.Style := [fsBold];
  //result.Text := 'Test'; // <--- diese Zeile würde funktionieren
  case Index of
  1: result.Erweiterung := ' mm';
  2: result.Erweiterung := ' µm';
  end;
end;
Die createWnd-Fkt in der KomponentenUnit:
Delphi-Quellcode:
procedure TDatenbankoberflaeche.CreateWnd;
begin
  inherited createwnd;
  // Initalisierung aller nötigen Komponenten
  FImage := CreateImage;
  FLEWert1 := CreateLabZahlEditEinheit(130,0,15,10,8,2);
  FLEWert2 := CreateLabZahlEditEinheit(220,147,15,10,8,1);
  FLEWert3 := CreateLabZahlEditEinheit(230,187,15,10,8,1);
  FLEWert4 := CreateLabZahlEditEinheit(220,231,15,10,8,1);
  FLEWert5 := CreateLabZahlEditEinheit(0,200, 15,10,8,1);
  FCBListe := CreateComboBox(350,10,150);

  // Prüft ob alle Voraussetzungen zu Verwendung der Datenbank gegeben sind und
  // schaltet die Komponente ein oder aus und gibt Fehlermeldungen aus
  if Verfuegbarkeit then Enabled := true
  else
    begin
      Enabled := false;
      if not ExcelVerfuegbarkeit then MessageBox(Self.Handle, 'Sie haben keine oder eine falsche Version Office auf dem Rechner installiert. Bitte verwenden sie MS Office 2003, damit eine fehlerfreie Verwendung der Datenbank gewährleistet ist.',
                                                              'MS Excel 2003 nicht gefunden', MB_OK);
      if not DateiVerfuegbarkeit then MessageBox(Self.Handle, 'Die Datei ' + ExcelDatenbankName + ' konnte nicht gefunden werden!',
                                                              'MS Excel 2003 nicht gefunden', MB_OK);
    end;
end;
Die Initialisierungs-Fkt der Komponente (ab hier reagiert die Komponente nicht mehr auf Änderungen der Texteigenschaft für die FLEWertX (X = [1..5]) aber warum?
Delphi-Quellcode:
procedure TDatenbankoberflaeche.Initialisieren;
var DWResult: DWORD;
    iUserLCID: integer;
begin
  if Enabled then
    begin
      iUserLCID := GetUserDefaultLCID;
      // Wenn die Datenbank extern über Excel geöffnet ist dann wird sie geschlossen.
      // wenn diese Datei nicht geschlossen wird, dann kommt es zu einer Exception!!!
      if FindWindow('XLMain','Microsoft Excel - ' + ExcelDatenbankName) <> 0 then
          SendMessageTimeout(FindWindow('XLMain','Microsoft Excel - ' + ExcelDatenbankName), WM_CLOSE, 0, 0,
          SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);
      FExcelApplication := TExcelApplication.Create(Nil);
      FExcelWorkbook := TExcelWorkbook.create(Nil);
      FExcelWorksheet := TExcelWorksheet.create(Nil);
      // vorhandener Exceldatei laden !!! wichtig !!! Die Anzahl der emtyParam ist Office-Versions abhängig
      FExcelApplication.Workbooks.Open(FsDatenbankPfad + ExcelDatenbankName, emptyParam, emptyParam, emptyParam, emptyParam
                          , emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam
                          , emptyParam, emptyParam, iUserLCID);
      // Excel soll NICHT angezeigt werden
      FExcelApplication.visible[iUserLCID] := false;
      // verbinden des Workbooks und des Worksheets mit der in der exc geladenen Datei
      FExcelWorkbook.ConnectTo(FExcelApplication.ActiveWorkbook);
      FExcelWorksheet.ConnectTo(FExcelWorkbook.ActiveSheet as ExcelWorksheet);
      //Showmessage(FExcelWorksheet.Shapes.Range[1].;
      GetAllSensorNamen; // <--- Ermittlung aller vorhandenen Datensätze anhand der Namen funktioniert!!
      SetItemsComboBox(FCBListe); // <--- Setzt die Namen der vorhandenen in eine CheckBox funktioniert!!
      GetAllSensorDaten; //<--- hier werden die Daten ermittelt, die in der SetSensordatenAnzeige-Fkt gesetzt werden sollen.
      SetSensordatenAnzeige; // <--- in dieser Fkt werden die Text-Eigenschaften (eigentlich) geändert.
      //Showmessage(inttostr(FExcelWorksheet.Shapes.Count));
    end
  else MessageBox(Self.Handle, 'Es sind Fehler beim Öffnen der Datenbank aufgetreten. Bitte beachten sie die Meldungen.', 'Datenbank kann nicht geladen werden',MB_OK);
end;

procedure TDatenbankoberflaeche.GetAllSensorDaten;
var Index: integer;
    sTemp: string;
begin
  Index := GetItemIndex;

  FRecord.sName := FCBListe.Items[Index];
  sTemp := FExcelWorksheet.Cells.Item[Index+10,3];
  FRecord.dWert1 := strtofloat(sTemp);
  FRecord.dWert2 := strtofloat(FExcelWorksheet.Cells.Item[Index+10,4]);
  FRecord.dWert3 := strtofloat(FExcelWorksheet.Cells.Item[Index+10,5]);
  FRecord.dWert4 := strtofloat(FExcelWorksheet.Cells.Item[Index+10,6]);
  FRecord.dWert5 := strtofloat(FExcelWorksheet.Cells.Item[Index+10,7]);

end;

procedure TDatenbankoberflaeche.SetSensordatenAnzeige;
var Index: integer;
begin
  Index := GetItemIndex;
  FLEWert1.Text := 'Hallo';
  FLEWert2.Text := floattostr(FRecord.dWert2);
  FLEWert3.Text := floattostr(FRecord.dWert3);
  FLEWert4.Text := floattostr(FRecord.dWert4);
  FLEWert5.Text := floattostr(FRecord.dWert5);
end;
Also ich habe einiges an Überprüfungen schon selber durchgeführt und kann mir bisher noch nicht erklären, warum die Anzeige nicht geändert wird. Eventuell wird einfach nur nicht mehr "Refresh" der Komponente gemacht aber auch die der "Zwang" mit Datenbank.Refresh in der Hauptform führte zu keiner Änderung.
Ich habe das ganze dann mal im Debugger überprüft und in der GetAllSensordaten-Fkt stehen verschiedene Werte auf beiden seiten der Zuweisung. Hier ist noch nicht so richtig klar, warum. Er ließt zwar den Namen richtig ein, danach stehen aber nur 0 in den restlichen Werten.
Allerdings werden weder die Nullen noch der Versuch mit dem "Hallo" von dem Compiler als Fehler angesehen, noch erscheint dies auf meiner Form. Der Versuch die Texteigenschaft zu setzen schlägt also fehl. Die Komponente an sich kann ich verwenden, da ich mit ihr in der Runtime arbeiten kann. Dort Funktioniert sie gut, außer dass ebend die Werte bei der Initialisierung gesetzt werden.

Hoffe jemand kann mir dort helfen.

Vielen Dank
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat