Witam serdecznie, piszę, ponieważ napotkałem dość nietypowy problem, którego jak się okazało nie mogę na żaden sposób rozwiązać.
Sprawa dotyczny TToolButton i obrazów w TImageList.
Mam formularz, który w późniejszym czasie będzie służył jako okno dialogowe. Są na nim komponenty typowe jak na standardowych dialogach. Prócz tego, jest komponent TToolBar. Na tym komponencie tworzę dynamicznie listę dysków - sprawdzam ile jest partycji z flagą DRIVE_FIXED przez GetDriveType, po czym dynamicznie tworzę tyle button'ów z klasy TToolButton, ile jest uzyskanych wcześniej partycji.
Nie ma najmniejszego problemu w uzyskaniu liter partycji opisanych jako DRIVE_FIXED. Z tworzeniem przycisków też nie ma większego problemu. Wszystko w tym temacie gra jak tamta lala. Problem pojawia się, gdy potrzebuje przypisać obraz z ImageList do utworzonego wcześniej przycisku.
Sprawa wygląda tak, że mam pięć partycji, stąd po pojawieniu się formy widnieje 5 przycisków na pasku. Litery dysków to: C:, E:, F:, G:, H:. W komponencie ImageList mam dodane dwie pierwsze ikony jako Pulpit i Moje dokumenty. Kolejne 25 to Obrazy typu PNG z grafiką dysku oraz jego literą. Podczas tworzenia przycisków obliczam z prostego wzoru indeks obrazu w ImageList:
dla znaku C - jego kod ASCII to 67, indeks obrazu z dyskiem C: to 2, więc 67 - 2 = 65
stąd:
ImageIndex := Ord('C') - 65;
W ten sposób mogę pozyskać dla każdej partycji w zależności od znaku indeks obrazu w ImageList.
I niestety tutaj pojawia się nieoczekiwany problem. Mianowicie litery dysków pobiera bezbłędnie, Hint ustawia jako:
tbNew := 'Dysk lokalny (' + cDrive['C'] + ')';
z tym też nie ma żadnego problemu. Caption przycisku to ścieżka dysku (czyli w tym przypadku litera dysku i ':'). Też jest wszystko w porządku. Problem pojawia się podczas ładowania obrazów do przycisków (czyli ImageIndex). Tutaj jest kłopot, ponieważ indeksy są takie, jakie mają być, ale obrazy ładuje różnie. Pierwsze trzy przyciski są w porządku (czyli C:, E:, F:), ale dwa ostatnie zawsze są takie same. Niestety dla dysku G: zostaje przypisany obraz dysku H:. Dla dysku H: jest w porządku - obraz z dyskiem H:.
Mam więc pytanie - co jest źle w poniższym kodzie. Ja niestety nie mogę nic złego w tym znaleźć:
procedure TLoadPictureDialogForm.FormCreate(Sender: TObject);
var
tbNew: TToolButton; //nowy przycisk
cDrives: array of Char; //tablica z odnalezionymi literami partycji
cDrive: Char; //licznik pętli wyszykującej
iLeft: Integer; //nie dotyczy - służy do ustawiania kolejności przycisków
I: Byte; //licznik pętli
begin
{DRIVE MENU}
iLeft := 78;
SetLength(cDrives, 0);
for cDrive := 'C' to 'Z' do //tworzenie listy partycji
if GetDriveType(PChar(cDrive + ':\')) = DRIVE_FIXED then
begin
SetLength(cDrives, Length(cDrives) + 1);
cDrives[High(cDrives)] := cDrive;
end;
if Length(cDrives) > 0 then //jeżeli znaleziono jakąś partycję
for I := 0 to High(cDrives) do
begin //tworzenie przycisków
tbNew := TToolButton.Create(Self);
with tbNew do
begin
Name := 'tbDrive' + cDrives[I];
Parent := tbMenu;
Caption := cDrives[I] + ':\';
iLeft := iLeft + 39;
Left := iLeft;
Cursor := crArrow;
ImageIndex := Ord(cDrives[I]) - 65; //ustawienie indeksu obrazu
ShowHint := True;
ParentShowHint := False;
Hint := 'Dysk lokalny (' + cDrives[I] + ':)'; //ustawienie podpowiedzi
end;
end;
end;
Dodam jeszcze, że obrazy w komponencie ImageList są poukładane prawidłowo, sprawdzałem też czy grafiki się powtarzają, ale nic takiego nie ma miejsca.
Bardzo proszę o pomoc.
Dziękuję z góry. Pozdrawiam.