[Delphi] komponent Image z opcją images

0

witam

poszukuje komponentu image aby mozna byllo do niego zaladowac grafike nie z pliku, ale wskazac mu aby wyswietlal grafike z komponentu imagelist do ktorego laduje okolo 60 grafik w tym samym rozmiarze o wymiarach:

imagelist1 posiada grafiki o wymiarach 300x150
imagelist2 posiada grafiki o wymiarach 150x150

i teraz chcualbym umiescic na formie 2 komponenet o takich samych wymiarach jak sa grafiki w imagelist, tak wiec byly by to 2 komponenty o rozmiarach 300x150 i 150x150.
Poprzez komponent combobox chcialbym zmieniac grafiki wyswietlane w komponencie image a ktore znajduja sie w komponencie imagelist.

prosz o podpowiedz

pozdrawiam

0

Nie wiem w czym problem. Dodajesz sobie jakieś pozycje do ComboBoxa, a następnie w jego zdarzeniu
OnChange wklejasz poniższy kod i elegancko pokazuje Tobie bitmapy o wybranym w ComboBox indeksie.

var
  I : integer;
  Bmp : TBitmap;
begin
  Bmp := TBitmap.Create;
  I := ComboBox1.ItemIndex;
  if I < ImageList1.Count then
    begin
    ImageList1.GetBitmap(I, Bmp);
    Image1.Stretch := True;
    Image1.Picture.Bitmap := Bmp;
    end
    else
    begin
    Image1.Picture := nil;
    end;
  Bmp.Free;
end;

Natomiast jeżeli chcesz pokazywać w ImageList obrazki większe niż 32x32 piksele to musisz sobie raczej
utworzyć dynamicznie ImageList w odpowiedni sposób używając konstruktora CreateSize, który wymaga 2
parametrów - mianowicie szerokości oraz wysokości obrazków. Możesz podać "na sztywno", a możesz te
wartośći pobrać z bitmapy. Wtedy ładujesz obrazki tak jak powyżej pokazałem tyle tylko, że z dynamicznie
utworzonego ImagList. W przykładzie ładuję bitmapę z pliku ale lepiej będzie zrobić to z zasobów exeka.

var
  Bmp : TBitmap;
  IL : TImageList;
begin
  Bmp := TBitmap.Create;
  Bmp.LoadFromFile('D:\test.bmp');
  IL := TImageList.CreateSize(300, 150);
  IL.Masked := False;
  IL.Add(Bmp, nil);
  Image1.Picture.Bitmap := Bmp;
  Bmp.Free;
end;

Jak widzisz - nie trzeba do tego celu korzystać z jakiś specialnych komponentów, wystarczą te, które śa w
Delphi już dostępne. Odpisz czy o to Tobie chodziło, czy coś innego chciałeś sobie tam wykombinować :)

0

witam

tak o to mi chodzilo :D pierwszy przyklad dziala tak jak bym tego chcial, ale napotkalem inne problemy :(
otoz nie chce mi sie skompilowac program gdy do imagelist dodad 70 obrazkow o wielkosci 150x300 :(
wiec chyba musze to inaczej zrobic. ponadto zastanawiam sie jak w komponent panel dodac scrollbar
(musze umiescic 70 obrazkow i potrzebuje pionowy scroll mozesz mi cos doradzic ???

0

Co do komponentu ze ScrollBarem, w ktorym można umieszczać inne komponenty to ja bym użył z
zakładki "Additional" - komponentu ScrollBox. Natomiast co do umieszczania obrazków, to nie wiem
w zasadzie po co Tobie te ImageListy, możesz (i ja bym tak zrobił) dodać całą grafikę do zasóbów, a
jeżeli jest jej dużo to wiadomo exec "spuchnie", ale wtedy dodając te pliki do spisu w pliku *.rc daj z
początku zamiast nazwy #1 #2 i tak dalej, a później ładuj tak jak pokazałem poniżej. W sumie tutaj
jest przykład dla Jpegów (do sekcji uses trzeba dodać moduł JPEG), ale łatwo to przerobić na bmp i
też wczytać. Jeżeli nie chcesz aby "pucnnął" exec to możesz utworzyć pustą bibliotekę dll tylko do
przechowywania zasobów. Wtedy zamiast HInstance w poniższym kodzie ładujesz uchwyt do Twojej
biblioteki dll - zwrócony przez LoadLibrary. Poniżej masz dwa przykłady: zwykły oraz z użyciem dll.

{$R zasoby.res}
var
  ResID : integer;
  JpgSrc : TJpegImage;
  Stream : TResourceStream;
begin
  ResID := ComboBox1.ItemIndex + 1;
  try
    Stream := TResourceStream.CreateFromID(HInstance, ResID, RT_RCDATA);
    JpgSrc := TJpegImage.Create;
    JpgSrc.LoadFromStream(Stream);
    Image1.Picture.Assign(JpgSrc);
    JpgSrc.Free;
    Stream.Free;
  except
    Image1.Picture := nil;
  end;
end;

Tutaj kod dla dllki, tylko jak wspomniałem zmień sobie kostruktor z Create na CreateFromID:

var
  H : Thandle;
  JpgSrc : TJpegImage;
  Stream : TResourceStream;
begin
  H := LoadLibrary('dllka.dll');
    if H <> 0 then
    begin
    JpgSrc := TJpegImage.Create;
    Stream := TResourceStream.Create(H, 'cosik', RT_RCDATA);
    JpgSrc.LoadFromStream(Stream);
    Image1.Picture.Bitmap.Assign(JpgSrc);
    Stream.Free;
    JpgSrc.Free;
    end;
end;
0

witam

wiec <ort>na razie </ort>umiescilem wszystkie grafiki w komponencie ScrollBox, ale mam takie pytanie ... nie wiem ale chyba w tym komponencie nie mozna zmienic koloru suwaka, podobnie mam problem ze zmianą koloru w komponencie PageControl. chcialbym aby cala forma przyjela kolor $000033 i udalo mi sie zmienic tlo na taki kolor w komponencie ScrollBox (zmiana tla).

0

Mogę się mylić, ale chyba nie ma możliwość zmiany kolorów ScrollBarów. Chyba trzeba poszukać
jakiś innych komponentów. A może jest jakaś inna metoda aby to osiągnąć, ale ja jej nie znam ;/

0

a jak zmusic komponent scrollbox, by sie przewijal gdy poruszam rolką w myszce ???

0

Poniższy kod działa ok. Wziąłem go ze strony http://forum.ks-ekspert.pl/index.php?s=a76f339ccdf6c7a0422213e5c1887a0c&showtopic=89930&mode=linear

procedure TForm1.ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
   ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position - WheelDelta div 5;
end;
0
procedure TKomunikator.ScrollBox1MouseWheelUp(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
  scrollbox1.VertScrollBar.Position:=scrollbox1.VertScrollBar.Position-150;
end;

no wlasnie to mi nie dziala [???]

0

To nie wiem, u mnie na standardowym ScrollBoxie po umieszczeniu na formatce umieściłem przycisk i
dałem mu Top większe niż wysokość ScrollBoxa i uruchomiłem aplikację. I z tego co sprawdziłem bez
problemów przewijałem zawartość przy użyciu tego kodu, który wkleiłem. Ale z tego co pisali na tym
forum KŚ Ekspert - są jakieś problemy z Focusem i nie zawsze działa, jednak nie wiem jak to obejść ;/

1 użytkowników online, w tym zalogowanych: 0, gości: 1