Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Sehr mysteriöses Problem mit Stringzuweisung


LonghornUser - So 26.04.09 15:37
Titel: Sehr mysteriöses Problem mit Stringzuweisung
Hallo,

ich bin gerade etwas ratlos. Ich weise einem String einen anderen zu. Aber die Zuweisung klappt aus irgendeinem Grund nicht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  showmessage(s1); //es wird "XYZ" ausgegeben, der Inhalt von s1
  showmessage(Combobox3.Itemsex[2].Caption); //es wird "ABC" ausgegeben, der Inhalt von Item2 vor der Zuweisung

  Combobox3.Itemsex[2].Caption  := s1; //Die Zuweisung

  showmessage(s1); //es wird "XYZ" ausgegeben, der Inhalt von s1
  showmessage(Combobox3.Itemsex[2].Caption); //es wird "ABC" ausgegeben, der Inhalt von Item2 vor der Zuweisung


Ich habe da irgendeinen Denkfehler drin, zumal aus bei allen andere Stringzuweisungen (die danach und auch davor kommen) klappt.

Könnt ihr mir da bitte nochmal aushelfen :( ?

Ciao LHUser


FinnO - So 26.04.09 15:40

sehr mysteriös. setz doch mal ein paar Haltepunkte und beobachte das Verhalten von der Caption mal schritt für schritt.


F34r0fTh3D4rk - So 26.04.09 15:43

Der Code sieht soweit in Ordnung aus, die Frage ist nur, was ist Itemsex? (und will ich das überhaupt wissen? :lol:)
Vielleicht solltest du einen größeren Ausschnitt deines Quellcodes posten.

mfg


LonghornUser - So 26.04.09 15:46

Das geht leider nicht so einfach, denn das ganz befindet sich im OnCreate. Und es hat auch kein anderes Event Zugriff auch.

Führe ich die Routine allerdings zweimal aus, geht das ganze ???

ItemsEx ist die Items-Eigenschaft einer ComboboxEx (VCL). Was auch sehr komisch ist: Wenn ich nicht s1 sondern 'XYZ' zuweise, geht es ???????
Korrigiere: Das geht doch nicht.

Edit: Also scheinbar hab ich das Problem "behoben". Wenn ich es so mache, geht es wieder:

Delphi-Quelltext
1:
2:
  combobox3.ItemIndex := 2;
  Combobox3.Itemsex[2].Caption  := s1;


Nur das kann doch nicht die Lösung sein, oder ?


F34r0fTh3D4rk - So 26.04.09 15:55

Gibt es nicht noch eine andere Eigenschaft außer ItemsEx, die du nutzen kannst? Vielleicht ist die ja nur Read-Only.


LonghornUser - So 26.04.09 16:01

Nein, das ist die einzige. Witzigerweise geht die Zuweisung bei allen anderen ItemsEx's. Und wieso geht es auf einmal, wenn ich den ItemIndex verändere ?


Regan - So 26.04.09 16:14

Hallo,

hast du da nicht eine Ebene vergessen?

Delphi-Quelltext
1:
Combobox3.ItemsEx.ComboItems[2].Caption := 'hallo';                    


MfG
Regan


LonghornUser - So 26.04.09 16:41

Mhm, das hat das Problem nicht gelöst. Ich weiß auch nicht wirklich, wo der Unterschied zwischen beiden Wegen ist. Beide lassen sich erfolgreich kompilieren, aber der Fehler zur Laufzeit bleibt bei beiden bestehen.


Xentar - So 26.04.09 16:56


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button1Click(Sender: TObject);
var s1: string;
begin
  s1 := 'test123';
  ComboBoxEx1.ItemsEx[2].Caption  := s1;
end;

Tut bei mir ohne Probleme.
Vorher steht "blah" an der Stelle, und wenn ich auf den Button klicke test123.

Hast du vielleicht noch Eigenschaften zugewiesen, die solch eine Änderung verhindern könnten?
Kannst du das Problem in nem Test-Projekt nachstellen?
Überschreibst du den Eintrag später nochmal irgendwo?

Edit: Man sollte das Ex echt groß schreiben - sonst könnte man auf merkwürdige Gedanken kommen ;)


LonghornUser - So 26.04.09 17:44

Nee, ein Testprojekt lässt sich da nicht zusammenstellen. Ist etwas verzwickt.

Wenn ich mal Muße habe, suche ich nochmal, aber im Moment reicht es auch so. Danke !


Jakob_Ullmann - So 26.04.09 17:53

Also TComboItemEx.Caption ist laut Hilfe schonmal nicht read-only.

Was mir dazu einfällt, ist, dass s1 vielleicht nicht definiert ist?

@Xentar: Du meinst, falls die SHIFT-Taste ein wenig klemmt? :lol:


LonghornUser - So 26.04.09 18:10

s1 ist eine globale Variable. Aber wie gesagt, ich mache diese Zuweisungen im Rahmen einer Lokalisierung (Sprachen) und es klappte bisher immer.


Jakob_Ullmann - So 26.04.09 19:02

sorry. Also ich meinte eigentlich, ob der Variablen ein Wert zugewiesen wurde.


Andreas L. - So 26.04.09 19:19

Pack das setzen des ComboBox-Eintrags ins OnShow oder definiere eine weitere Routine die du am Ende von OnCreate aufrufst. Z. B.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Translate;
begin
  ComboBox1.ItemsEx[0].Caption := 'blubb';
  //weitere Controls übersetzen
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Einstellungen laden
  //Sprachdatei laden
  //etc
  Translate;
end;


EDIT: Vllt. noch ComboBox1.Refresh aufrufen...


LonghornUser - So 26.04.09 19:25

Genauso ist es bereits. Ich habe eine SetLanguage Routine, wo das alles drin steht. Nur versteh ich nicht ganz, in wieweit das das Problem lösen soll ?


Andreas L. - So 26.04.09 19:30

user profile iconLonghornUser hat folgendes geschrieben Zum zitierten Posting springen:
Genauso ist es bereits. Ich habe eine SetLanguage Routine, wo das alles drin steht. Nur versteh ich nicht ganz, in wieweit das das Problem lösen soll ?


So mach ich das in allen meiner Projekte und es geht.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure TfrmControlPanel.FormCreate(Sender: TObject);
begin
  Config := TCookieCrumblerApp.Create(nil);
  if FileExists(ExtractFilePath(Application.ExeName) + 'config.dat'then
    Config.LoadFromFile(ExtractFilePath(Application.ExeName) + 'config.dat')
  else
    Config.LoadFromFile(IncludeTrailingPathDelimiter(GetShellFolder(CSIDL_APPDATA)) + 'CapSystems\CookieCrumbler\config.dat');
  LanguageManager.LoadLanguage(LanguageManager.LanguageExists(Config.Language));

  if (Config.MainWindowLeft = -1and (Config.MainWindowTop = -1then
    Position := poScreenCenter
  else
    Position := poDesigned;

  Left := Config.MainWindowLeft;
  Top := Config.MainWindowTop;
end;

procedure TfrmControlPanel.FormShow(Sender: TObject);
begin
  Translate;
end;

procedure TfrmControlPanel.Translate;
begin
  with LanguageManager.CurrentLanguage do
  begin
    itmFileMenu.Caption := ReadString('frmControlPanel''itmFileMenu''');
    //etc...
  end;
  RefreshAllLabels;
end;