Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Jak zrobić ruchomy obrazek w Delphi ?

DarknessWalker 12 Lis 2010 16:06 1827 11
  • #1 12 Lis 2010 16:06
    DarknessWalker
    Poziom 10  

    Chciałam się zapytać czy ktoś wie jak można ten program przerobić, żeby nie używać "Fly" i zrobić ruchomy obrazek zamiast napisu ?
    Kod wczytanego z pliku jest taki: " Bitmap.LoadFromFile('D:\1.jpg')" ale mi chodzi o obrazek już utworzony w Delphi "Image" na który został wczytany obrazek.


    Code:

    unit DemoFrm;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Fly, StdCtrls, ExtCtrls, ComCtrls;

    type
      TDemoForm = class(TForm)
        StatusBar1: TStatusBar;
        Fly: TFly;
        Bevel1: TBevel;
        cbRun: TCheckBox;
        procedure cbRunClick(Sender: TObject);
        procedure FlyStart(Sender: TObject);
        procedure FlyStop(Sender: TObject);
        procedure FlyClick(Sender: TObject);
      end;

    var
      DemoForm: TDemoForm;

    implementation

    {$R *.dfm}

    procedure TDemoForm.cbRunClick(Sender: TObject);
    begin
      Fly.Active := cbRun.Checked;
    end;

    procedure TDemoForm.FlyStart(Sender: TObject);
    begin
      StatusBar1.SimpleText := 'Uruchomiono...';
    end;

    procedure TDemoForm.FlyStop(Sender: TObject);
    begin
      StatusBar1.SimpleText := 'Zatrzymano...';
    end;

    procedure TDemoForm.FlyClick(Sender: TObject);
    var
      S : String;
    begin
      S := InputBox('Wpisz tekst...', 'Tekst:', Fly.Caption);
      if S <> '' then
        Fly.Caption := S;
    end;

    end.

    0 11
  • #3 12 Lis 2010 19:55
    DarknessWalker
    Poziom 10  

    Chyba jest odpowiedzialne za poruszanie się obiektów. Ale nie jestem pewna bo ten kod na Internecie znalazłam i mnie trochę zaskoczyło, że to musi być w "uses".

    Ale już mi się udało jakoś to obejść i zrobić poruszające się obrazki, tylko, że nie wiem co zrobić żeby się teraz odbijały od krawędzi. Zrobiłam tylko, żeby się zatrzymały przy krawędzi:

    Code:

        Image2.Left:=Image2.Left-x2;
        If Image2.Left<0 then
        begin
        Image2.Left:=Image2.Left+x2;
        end;


        Image3.left:=Image3.left+x3;
        If Image3.Left>Panel.Width-40 then
        begin
        Image3.left:=Image3.left-x3;
        end;

        Image4.Top:=Image4.Top-y4;
        If Image4.Top<0 then
        begin
        Image4.Top:=Image4.Top+y4;
        end;

        Image5.Top:=Image5.Top+y5;
        If Image5.Top>Panel.Height-60 then
        begin
        Image5.Top:=Image5.Top-y5;
        end;

    0
  • Pomocny post
    #4 12 Lis 2010 21:34
    Dżyszla
    Poziom 42  

    Nie jest to optymalny sposób (powoduje migotanie) ale na początek wystarczy :)

    Co do odbijania się - zapamiętuj coś takiego jak stałą inkrementującą. a po dotarciu obiektu do ściany - zmieniasz znak tej stałej na przeciwny. Oczywiście sprawę należy rozpatrzyć w dwóch wymiarach - jeśli osiągniesz prawą lub lewą krawędź - zmieniasz znak tej stałej odpowiedzialnej za x. Analogicznie z y.

    0
  • #5 13 Lis 2010 15:20
    DarknessWalker
    Poziom 10  

    Teraz działa, dzięki =)
    Miałam trochę problemów jak zmienne miałam w procedurze ale po zamianie na globalne zaczęło działać.

    0
  • #6 24 Lis 2010 18:55
    DarknessWalker
    Poziom 10  

    Zrobiłam coś takiego, że jak odległość środków dwóch obrazków przemieszczających się po formatce będzie mniejsza niż wysokość czy szerokość jednego z nich to ten drugi staje się niewidzialny. Poniżej jest fragment kodu...
    Jeszcze mam pytanie czy można jakoś inaczej zapisać w Delpi długość, szerokość i widzialność obiektów ? Bo mi wskazuje błąd na "Width", "Height" i "Visible".


    Code:

        if ((OdlSr01 < (MainForm.FindComponent('Image1')).Width) or (OdlSr01 < (MainForm.FindComponent('Image1')).Height)) then
             begin
          (MainForm.FindComponent('Image1')).Visible:=false;
             end;

    0
  • #7 24 Lis 2010 22:06
    walek33
    Poziom 28  

    Zadam głupie pytanie. Mogę? Czemuż to koleżanko odwołujecie się do obrazka per findcomponent? Możesz przecież bezpośrednio image1.width i nie powinno być błędów.

    0
  • Pomocny post
    #8 25 Lis 2010 10:24
    arnoldziq
    Moderator Programowanie

    DarknessWalker napisał:
    Jeszcze mam pytanie czy można jakoś inaczej zapisać w Delpi długość, szerokość i widzialność obiektów ? Bo mi wskazuje błąd na "Width", "Height" i "Visible".

    Błąd Ci wyskakuje, bo TForm.FindComponent zwraca zazwyczaj klasę TComponent, która nijak się nie na do TImage i jego cech, których używasz.
    Jak już koniecznie chcesz sobie życie komplikować, to zrób przynajmniej tak :
    Code:
    TImage(MainForm.FindComponent('Image1')).Visible:=...

    Albo jak już nadmienił kolega w poście powyżej:
    Code:
    Image1.Visible:=...

    Z tym, że proszę zauważyć, że jak poprzez TForm.FindComponent, "zawołasz" jakiś komponent i jego nazwa lub typ nie będzie się zgadzała z oczekiwaniami, to trochę się namęczysz... szukaniem dlaczego Ci RTE wyskakuje :)

    0
  • #9 25 Lis 2010 17:27
    DarknessWalker
    Poziom 10  

    walek33 napisał:
    Czemuż to koleżanko odwołujecie się do obrazka per findcomponent? Możesz przecież bezpośrednio image1.width i nie powinno być błędów.


    Z tym też miałam problem. Jak dałam: "Image1.width" to mi wyskoczył błąd: "Undeclared identifier: 'Image1' ", więc też musiałam szukać "zastępnika".
    Może to dlatego, że program jest na wątkach...
    Ale to z tym "TImage" przed "(MainForm.FindComponent...)" działa. Dzięki za pomoc.

    0
  • Pomocny post
    #10 25 Lis 2010 20:26
    walek33
    Poziom 28  

    Cytat:
    Jak dałam: "Image1.width" to mi wyskoczył błąd: "Undeclared identifier: 'Image1' "

    Jeżeli rzeczony obrazek nie daje się zidentyfikować w ten sposób a leży na formie nazwanej przez Ciebie MainForm to zastosuj MainForm.Image1.Width. Powinno działać. Chyba że się mylę? :D

    0
  • Pomocny post
    #11 25 Lis 2010 21:22
    Dżyszla
    Poziom 42  

    Jesli wątek jest poza klasą, to z pewnością nie odwołasz się przez prostą nazwę samego obiektu. Musisz odwoływać się przez cały obiekt klasy TForm (czyli tak, jak kolega podał).

    Jednocześnie - jeśli na wątku bedziesz dokonywać obiektami VCL, to pamiętaj o wykonywaniu tego wyłącznie za pośrednicwem procedury wywoływanej poprzez polecenie Synchronize!

    0
  • #12 28 Lis 2010 18:44
    DarknessWalker
    Poziom 10  

    Faktycznie... Też działa =) Dzięki.

    0