Pewien problem ze zdarzeniami

Odpowiedz Nowy wątek
2004-11-16 01:35
Inter
0

Cześć

A więc zachciało mi się zrobić extra graficzny buttonik zmieniający obrazek zależnie od sytuacji.
Chciałem iść prostą drogą więc ten mój komponencik oparłem na bazie TImage
czyli:

Type
 TdzButton = class(TImage)

W założeniach ma reagować (zmieniać obrazki)
1) na najechanie na niego myszką
2) kliknięcie
3) puszczenie
4) zjechanie z jego obszaru przy wciśniętym klawiszu myszy (ma być wklęśnięty)
aż puszcze klawisz... itd
znaczy łeb w łeb jak to robią świrdołsy ;)
Wszystko pięknie opisałem - komunikaty itd..itd
ALE <ort>utknołem</ort> na takim problemie:
Mam przykładowo pare buttonów i wciskam pierwszy no i zaznacza mi się jako
domyślny ( pogrubienie ramki) czyli prawidłowo.
Następnie jade myszką wcisnąć drugi to ten drugi staje się domyślnym.
No i tu sęk ;(
Ten pierwszy musi w momenie naciśnięcia drugiego buttona stać się buttonem niedomyślnym czyli bez ramki zaznaczenia.
I jak to zrobić ? by zmienił obrazek ?
Przecież na niego nie klikam więc nie wygeneruje żadnego zdażenia

Jedynie mogę przechwycić nazwę klikniętego buttona jako "Button1"
Znaczy robię to tak:
klikam na button pierwszy - on sie robie aktywny (domyślny)
pobieram jego nazwe do zmiennej globalnej "Name"
Teraz jade kliknąc drugi button i tam na początku wyciagam nazwę tego pierwszego buttona no i coś powinienem zrobić np. Button1 ma zmienić obrazek na obrazek niedomyślnego buttona bo właśnie kliknołem na drugi który staje się domyślny.
Powiem tak : ładuje obrazki w ten sposób:

PROCEDURE TMojButton.Wyglad(Opcja:Byte);
Begin
//opcje:  0 - normany , 1 - podświetlony , 2 - naciśnięty, 3 - wyłączony
 //pobranie obrazka...
 if opcja = 0 then Picture.Bitmap.LoadFromResourceName(hInstance, 'button0');
 if opcja = 1 then Picture.Bitmap.LoadFromResourceName(hInstance, 'button1');
 if opcja = 2 then Picture.Bitmap.LoadFromResourceName(hInstance, 'button2');
 if opcja = 2 then Picture.Bitmap.LoadFromResourceName(hInstance, 'button2');
 //itd.

Wszystko wykonuje w procedorach pomiędzy
TMojButton...
coś tam...
end;
Zdażenia też np:
PROCEDURE TMojButton.MyszDBLCLK(var Message:Tmessage);

I teraz problem tkwi w tym że z wnętrza takiej procedury nie mogę załadować
obrazka do innego buttona pisząc: Button1.Wyglad(0);

Ten kod jest kodem komponentu - który ma być wstawiony na forme i tyle
A z poziomu programu przecież nikt nie bedzie śledził buttonów jak który ma i kiedy wyglądać <płacz>

Cienki Bolek jestem i prosze o pomoc może jest coś takiego żebym z wnętrza
takich procedur mógł posiadając nazwe np Button1 - coś z tym zrobić

jakiś send albo coś ?

Proszę pilnie o pomoc bo trzecią nocke siedze i strasznie oczy mam podsinione
no i chyba wage zrzuciłem :-/

Pozostało 580 znaków

2004-11-16 08:36
0

o ile zrozumialem to poczytaj o SetFocus;


Pozdrawiam. Karol

Pozostało 580 znaków

2004-11-16 09:31
0

o ile zrozumialem to poczytaj o SetFocus;

Timage nie posiada skupienia (nie ma SetFocus)

W zdarzeniu OnMouseDown (albo podobnym) - procedurka wyszukująca wszystkie inne obiekty tej klasy bezpośrednio znajdujące się na rodzicu - i odpowiednie ich ustawienie...


Pozostało 580 znaków

2004-11-17 06:07
Inter
0

Hej ;)

Posłuchałem rady DETOXA :) i coś takiego zrobiłem:

procedure ZerujButtony(nazwa:String);

  function Button(Nazwa:string):TControl;
  var
   I:Integer;
   begin
   for I:= 0 to Form1.ComponentCount-1 do
   if Form1.Components[I].Name = Nazwa then   //tu qrde musi być nazwa formy
   Result:= Form1.Components[I] as TControl;
  end;

Begin
 if nazwa > '' then
 begin
   Button(Nazwa).Create(nil);
 end;
End;

Działa extra - na nowo kreuje button, i mam ten efekt że button traci
obrazek domyślnego a rysuje się w nim niekliknięty button.

Jest jedno ALE

MUSZE podać nazwe formy w tej powyższej procedurze, no i jak ten problem ominąć skoro ta procedura MUSI być w unicie komponentu - a przecież
później wykorzystując ten komponent formy bedą miały różne nazwy.

Czy jest coś takiego by pobrać nazwe formy z wnętrza unitu komponentu ?
abym mógł zrobić tak:

<delphi> procedure ZerujButtony(form :TForm; nazwa:String); //i dalej jak w powyższym <delphi>

Pozostało 580 znaków

2004-11-17 18:36
0

jak potrzebujesz nazwy, to dodaj do porcedury parametr FormName jako string, i w czasie wywoływania procedury podaj tam Form1.Name

kazdy komponent ma wlasciwosc Name ktora zwraca jego nazwe...


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2004-11-17 22:27
Inter
0

Cześć

Z góry dzięki za podpowiedzi były bardzo przydatne. <full z dębowej beczki>+<naga rosjanka="rosjanka"> :)

Już mam wszystko OK tylko nie użyłem jak to poradziłeś pobrania nazwy formy jako string bo to mi nic nie daje

Tak zrobiłem:

IMPLEMENTATION 
Var
 Form :TComponent    //zmienna komponentu

//unit komponentu buttona
CONSTRUCTOR TMojButton.Create(AOwner: TComponent);
Begin
 inherited Create(AOwner);
 if Form = nil then Form:= AOwner; 
{powyżej pobieram formę jako komponent (i nie może być string)
no i musi być raz pobrana bo przy następnej kreacii wystąpi lubiane Acces... :)
dlatego warunek if }
Wyglad(0); //..a tu wysyłam do procedury rysującej 
End; 

{
a poniżej już dobrze działająca procedurka wyszukująca danego buttona 
wywoływana w kodzie procedury zawartej w unicie komponentu dla zdarzenia myszki (OnDown)
}
//-------------------------------------------
procedure ZerujButtony(nazwa:String);
  function Button(Nazwa:string):TControl;
  var
   x :Integer;
   begin
     Result:= nil;
     for x:=0 to Form.ComponentCount-1 do //tu występuje forma jako komponent nie string
       if Form.Components[x].Name = Nazwa then Result:= Form.Components[x] as TControl;
  end;
Begin
 if nazwa > ''  then Button(Nazwa).Create(nil);
End;
//-------------------------------------------

Ufff na razie działa :) ale mam propozycje może ktoś rozwinie ten temat bo w tym serwisie jest mało cosik materiałów
musiałem zgladać do kodów różnych komponentów
Chodzi o to że przykładowo pobierzesz w procedurze zawartej w kodzie unitu komponentu TMojButton.MouseUP - nazwe buttona do zmiennej tekstowej np:
Nazwa:= Name;

Następni klikając na drugi jakiś tam button na początku w/w procedury
pobierasz przechowaną nazwe poprzednio klikniętego buttona i odpowiednio go ustawiasz np. zmieniając mu wygląd.

A przecież nie podstawisz do stringa Nazwa.Wyglad(0);
musi być konkretnie button1.Wyglad(0);
i tu by się cosik przydało co wyszuka na podstawie nazwy dany button i umożliwi zmiane jego właściwości bo użyta procedura:
procedure ZerujButtony(nazwa:String);
w linni: if nazwa > '' then Button(Nazwa).Create(nil);
daje mi po kropce tylko standardowe właściwości np; Create, width, height itp.
a nie widzi procedury Wyglad(0); - dlatego ograniczony jestem tylko do ponownego wykreowania :-/

// mało materiałów? dodaj własne, to będzie więcej - ŁF

Przepraszam Łukasz ale źle mnie zrozumiałeś ehhh..
Nie chodziło mi akurat o zawartość tego serwisu tylko miałem na myśli że akurat na to zagadnienie co powyżej poruszyłem jest mało wskazówek.
Jeżeli zaś chodzi o całość serwisu to przykład tego że tu często goszczę świadczy
o jego zasobności.
Ironicznie zadrwiłeś że sam mógłbym coś dołożyć - i owszem ale już dawno temu
pytałem czemu pomimo prawidłowej rejestracji nie mam dostępu tak jak wielu innych użytkowników bym mógł napisać jakiś art lub podesłać jakiegoś progsa z kodami.
Nie wiem czy dobrze myślę bo nikt mi nie udzielił odpowiedzi w tej kwestii i domniemam że powodem tego jest to iż tu zarejestrowany jestem na IP serwera proxy i widocznie takie IP ten serwer odrzuca.
Popraw mnie jak sie mylę.

// nooo bez przesady. o problemach z logowaniem wiemy, ale nie wiemy dlaczego są. proxy nie są blokowane. arty - prześlij chociażby mi na @, to je wepchnę na Twoje konto - ŁF

HeHe ;)

I mam to czego szukałem i znalazłem to tutaj właśnie - to jest to bogactwo Łukasz :)
Może komuś się przyda ustawianie właściwości komponentów bez znajomości rodzica - czyli formy (kod komponentu)

Sumując - W kodzie komponentu :

// zadeklarować zmienną globalną formy jako zmienną komponentu 
Forma   :TComponent;
//w konstruktorze Create pobrać nazwe formy na którą będą kładzione komponenty:
if Forma = nil then Forma:= AOwner;

//zrobić sobie podobną procedurkę i to wszystko :)
PROCEDURE SzukajKomponent(Nazwa :String);
var
 x :Integer;
Begin
  for x:= 0 to Forma.ComponentCount-1 do
  begin
    if (Forma.Components[x] is TMojButton) and (TMojButton(Forma.Components[x]).Name = Nazwa) then
        TMojButton(Forma.Components[x]).Text:= 'a kuku';
  end;
End; 

Akurat tu szukałem wg nazwy, ale można zamiast Name podać inną właściwość do porównania

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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