![]() |
Texteigenschaft einer Komponente wird nicht mehr gesetzt
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:
Die create-Fkt der Komponente:
procedure TForm1.FormShow(Sender: TObject);
begin Datenbank := TDatenbankoberflaeche.Create(Self); Datenbank.Parent := Self; Datenbank.Left := 10; Datenbank.Top := 10; Datenbank.Initialisieren; end;
Delphi-Quellcode:
Die createWnd-Fkt in der KomponentenUnit:
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;
Delphi-Quellcode:
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?
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;
Delphi-Quellcode:
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.
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; 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 |
Re: Texteigenschaft einer Komponente wird nicht mehr gesetzt
Also hab erstmal soviel herausgefunden, dass es wohl mit dem Ort zu tun hat, wo ich das ganze kreiere. Hab jetzt mal eine von den Komponenten genommen und in einem neuen Projekt eingebaut und dort funktioniert das anscheinend auch nur, wenn der Aufruf in der OnCreate-Fkt der Form steht und nicht wenn es in der FromShow-Fkt steht. Weiß aber nicht, warum dies so ist.
Der Fehler wurde so auch in meinem jetztigen Projekt gelöst, alles was in Form.FromShow drin stand, steht jetzt in OnCreate und alles funktioniert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz