Buton olayları

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Buton olayları

Mesaj gönderen name »

Herkese iyi çalışmalar.
Bir butona tıklandığında mouse'un tuşunun basılı kaldığı süre içersinde bir işlem yaptırtmak istiyorum ama bir türlü beceremedim. OnClick ve OnMouseDown olayları işime yaramıyor. Çünkü bu olaylar mouse tuşunun basılı kaldığı süre içersinde değilde bir sefer çağırılıyor. Yani TUpDown bileşenin ilişkilendirildiği(Associate) nesneye uyguladığı olayı yapmak istiyorum (TUpDown bileşeni işime yaramıyor).TUpDown bileşeninin kodunu biraz inceledim 'TUDClickEvent' diye bir olay kullandığını gördüm ama delphi profesyonel anlamda bilmediğim için birşeyler anlamadım. Yardımcı olacak arkadaşlara şimdiden teşekkürler.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

global bir boolean değişken tanımlayın. OnMouseDown olayında bu global değişkeni True olarak atayıp, işlemi başlatın. OnMouseUp olayında da bu değişkeni False yapın, işlem sona ersin.

Kolay gelsin.
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Anlamadım

Mesaj gönderen name »

Öncelikle bu kadar Hızlı bir cevap verdiğiniz için tekrar teşekkür ediyorum.
Ama tam olarak ne yapmam gerektiğini anlamadım. Kendimi tam olarak ifade edemediğimi düşünüyorum. Aşağıda sizin cevabınızdan sonra bir örnek yaptım ama program kilitleniyor .Doğal olarak kilitlenmesi gerekir tabiki sadece ne yapmak istediğimi biraz daha iyi anlata bilmek için bu örneği yaptım.

Örnekte eğer butonun tag ındaki değer 1 ise label1'in posisyonu 1 piksel artıyor (up) , 2 ise label1'in posisyonu 1 piksel azalıyor (Down). Bu olayın kullanıcı elini mouse'un tuşunu bırakmadan devam etmesi gerekiyor. TUpDown bileşeninin ilişkilendirildiği(Associate) nesnenin değerini bir arttırması yada azaltması gibi.

procedure TForm1.SpeedButton1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
booleandeger:=True;
while booleandeger do
begin
case TControl(sender).Tag of
1:label1.Top:=label1.Top+1;
2:label1.Top:=label1.Top-1;
end;
end;
end;

procedure TForm1.SpeedButton2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
booleandeger:=false;
end;
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

koda ekleme yaptım, test ettim, onayladım :)

Kod: Tümünü seç

procedure TForm1.SpeedButton1MouseDown(Sender: TObject; 
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
  booleandeger:=True; 
  while booleandeger do 
  begin 
    //  Sleep(10); {bu da işlemi biraz yavaşlatır}
    Application.ProcessMessages;
    case TControl(sender).Tag of 
      1:label1.Top:=label1.Top+1; 
      2:label1.Top:=label1.Top-1; 
    end; 
  end; 
end; 
Kolay gelsin.
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Timer daha avantajlı

Mesaj gönderen name »

Bu serferde ProcessMessages'i geç algılıyor. Bundan dolayıda Label1'in posisyonunu, birer birer değilde 50-60 pixel birden kaydırıyor. Buton ile yapmak istediğim bu olayı DelphiTurk Formunada sormuştum orada bir arkadaşın tavsiyesi ile aşağıdaki kodu yazdım. Gayet güzel çalışıyor. Ben bu olayı global windows mesaj yöneticileri ile yapmak istemiştim ama buda işe yarıyor.

Kod: Tümünü seç


var n:Byte=0;
..
procedure TForm1.SpeedButton1MouseDown(Sender: TObject;Button: TMouseButton; Shift:TShiftState; X, Y: Integer);
begin
  n:=TControl(sender).Tag;
  Timer1.Enabled:=true;    // Interval değeri 50
end;

procedure TForm1.SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton;Shift:TShiftState; X, Y: Integer);
begin
  n:=0;
  Timer1.Enabled:=False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  case n of
    1:label1.Top:=label1.Top+1; //
    2:label1.Top:=label1.Top-1;
  end;
end;

Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

benim koyduğum Sleep satırı da aynı işi görüyor zaten. Neyse hallettiyseniz tamam.

İyi günler.
Cevapla