Problem z Formami...

0

Problem jest taki:
Ma dwie Formy.

Na pierwszej mam pare przyciskow ktore podswietlaja sie po najechaniu na nie myszka. Gdy klikam ktorys z nich to otwiera mi sie druga forma tworzona za pomoca metody
try

finally...

Zauwazylem, ze gdy wyjade kursorem mychy poza druga forme i kursor znajdzie sie nad ktoryms z wczesniej utworzonych przyciskow to przycisk ten zaczyna migac.
Tak tez powinien sie zachowywac i zachowuje kiedy dzialam w pierwszej formie, ale gdy otworzy mi sie druga to chcialbym aby przyciski z pierwszej formy przestaly reagowac...
Co mam zrobic? Czy mozna jakos temu zapobiec? hmm... --take care,

Wodzu

0

A jak robisz to podswietlanie?

--Pawel

Delphi6

0

podswietlanie robie prymitywna metoda ktora mi sie tez nie podoba :[[

robie to tak:

procedure TForm1.Miganie_Planety;
var
i : byte;
T :TPoint;

begin
repeat
Application.ProcessMessages;
GetCursorPos(T);
Application.ProcessMessages;
for i:=1 to 63 do
begin
Application.ProcessMessages;
if Sender=Planeta[i].Widok_Planety[1] then
begin
Application.ProcessMessages;
If (T.X&ltPlaneta[i].Widok_planety[1].Left) or (T.Y&ltPlaneta[i].Widok_planety[1].Top) or (T.X&gtPlaneta[i].Widok_planety[1].Left+13) or (T.Y&gtPlaneta[i].Widok_planety[1].Top+13) then begin wejscie:=False;break;end;
Application.ProcessMessages;
Planeta[i].Widok_planety[1].Picture.LoadFromFile('C:\gwiazda.bmp');
Application.ProcessMessages;
Sleep(350);
Application.ProcessMessages;
Application.ProcessMessages;
Planeta[i].Widok_planety[1].Picture.LoadFromFile('C:\gwiazda2.bmp');
Application.ProcessMessages;
Sleep(350);
Application.ProcessMessages;
end;
end;
until wejscie=False;
Wejscie:=True;
end;

Nie wiem czy cos zrozumiesz z tego kodu;) wiec to troszke obajsnie...

Podswietlanie zrobilem tak ze sprawdzam najpierw czy myszka znajduje sie na obrazku, jesli tak to laduje z dysku inny obrazek na miejsce tego nad ktorym znajduje sie kursor myszki, czekam ilestam milisekund, i laduje kolejny i znowu czekam. I powtazam to w petli dopoty, dopoki myszka nie zjedzie z obrazka.
Jak widzisz metoda jest prymitywna bo Application.ProcessMessages i tak nie dziala za dobrze. Wiem ze powinienem to zrobic za pomoca Timera, ale nie bardzo wiem jak...
Sadze, ze takie zachowanie mojej formy drugiej jest spowodowane tym ze jest ona modalna... o to chodzi?--take care,

Wodzu

0

Rczeczywiście nie wygląda ten kod szczególnie elegancko. Ale ważne, że działa {brawo} !

Mam taki prosty pomysł.

procedure TForm1.Miganie_Planety;
var
i : byte;
T :TPoint;

begin
if Form2.Visible then Exit;--Pawel

Delphi6

0

Wiem ze kod jest lamerski :D i z gory za to przepraszam;)

Niestety Twoj pomysl nie dziala...zaraz po kompilacji dostaje Acces Violation...
dlaczego?

--take care,

Wodzu

0

a moze drugą forme wyswietlaj :

Form2.ShowModal;

nie wiem czy rozwiąże to Twój problem no ale spróbowac mozesz

pozdro

0

Przypuszczam, ze procedura MiganiePlanety jest wywolywana zaraz po stworzeniu Form1, zanim zostanie stworzony Form2.

Jesli tak to albo:
opoznij uruchomienie procedury az zostanie stworzony Form2.

albo zrob tak:

w deklaracji Form1

private
fForm2Shown : Boolean;
public
property Form2Shown : Boolean read fForm2Shown write fForm2Shown;

w OnCreate Form1
Form2Shown:=False;

w Unit2

uses unit1;

w OnShow Form2
Form1.Form2Shown:=True;

w OnClose Form2
Form1.Form2Shown:=False;

w Twojej procedurze

procedure TForm1.Miganie_Planety;
var
i : byte;
T :TPoint;

begin
if Form2Shown then Exit;

moze tak pojdzie hmm... --Pawel

Delphi6

0

Dzieki, juz wiem o co chodzi {browar}

A teraz prosze pomorz mi z moim lamerskim kodem :D --take care,

Wodzu

0

Moze wyjasnie dokladniej o co mi chodzi...

Napisalem komponent typu TImage ktory zawiera dwa dodatkowe zdarzenia; onMouseOver i OnMouseOut. Dokladnie taki sam jak gdzies tutaj jest opisany.
Teraz chcialbym zeby po najechaniu na nim myszka obrazek sie zmienial co pewien okres czasu i w ten sposob wydawalo by sie ze on miga. Po prostu podmienialbym obrazek takim samym obrazkiem tylko nieco jasniejszym.
Masz pomysl jak to zrobic...?

--take care,

Wodzu

0

No wiec mam taki pomysl:

na Form1 jest Image1 (TImage) oraz Timer1 (TTimer)
Timer jest Enabled False, Interval 250

Kod wyglada nastepujaco (tworzy bitmapy, ty powinienes zaladowac z pliku).

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Image1: TImage;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
Bitmapy :array [0..1] of TBitmap;
Counter : Integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Image1.Picture.Assign(Bitmapy[Counter]);
Counter:=1-Counter;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Timer1.Enabled:=False;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Timer1.Enabled:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
for i:=0 to 1 do
begin
Bitmapy[i]:=TBitmap.Create;
Bitmapy[i].Height:=Image1.Height;
Bitmapy[i].Width:=Image1.Width;

end;
Bitmapy[0].Canvas.Brush.Color:=clGreen;
Bitmapy[0].Canvas.FloodFill(0,0,clWhite,fsSurface);
Bitmapy[1].Canvas.Brush.Color:=clRed;
Bitmapy[1].Canvas.FloodFill(0,0,clWhite,fsSurface);
Counter:=0;
Image1.Picture.Assign(Bitmapy[0]);
Form1.DoubleBuffered:=True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Bitmapy[0].Destroy;
Bitmapy[1].Destroy;
end;

end.

Nie wiem, czy jest sensowny, ale tyle wymyslilem... Przynajmniej dziala {hello}
--Pawel

Delphi6

0

Bardzo Ci dziekuje za wlozony trud i poswiecony czas {browar} --take care,

Wodzu

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