AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Texteigenschaft einer Komponente wird nicht mehr gesetzt
Thema durchsuchen
Ansicht
Themen-Optionen

Texteigenschaft einer Komponente wird nicht mehr gesetzt

Ein Thema von BAMatze · begonnen am 29. Mai 2009 · letzter Beitrag vom 29. Mai 2009
Antwort Antwort
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
BAMatze

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

Re: Texteigenschaft einer Komponente wird nicht mehr gesetzt

  Alt 29. Mai 2009, 14:37
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.
2. Account Sero
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz