Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
4 Puanlık Soru
#1
Merhabalar,

Bir döngü içerisindeyiz... Döngü devam ederken esc tuşuna basınca kullanıcıya soru sormak istiyorum duruma göre devam edeceğim ya da çıkacağım.

Bunu nasıl yapardınız ?

for I := 0 to 10000 do
  begin
   Memo1.Lines.Add('Items' + inttostr(i));
   if BASILANTUŞ=VK_ESCAPE then // Esc tuşuna basıldıysaa
   begin
     if MessageDlg('Escye bastın çıkayım mııı yoksa yanlışlıkla mı oldu ?',
       mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
     begin
       Break
     end;
   end;
 end;
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#2
if GetKeyState(VK_ESCAPE)<0 then

kullanabilirsin.

Daha karışık şeyler olursa WaitForSingleObject de olur.
Cevapla
#3
Merhaba.

Bir ekleme yapmak isterim, döngü içinde sisteme nefes aldıracak unsur yoksa belki de bir Application.ProcessMessages; satırı ilavesi ile mesajların yürümesini sağlamanız gerekebilir. Yoksa tuşu yakalama ve döngü içinde dikkate imkanı olmayabilir.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#4
(05-09-2018, Saat: 14:58)ssahinoglu Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
if GetKeyState(VK_ESCAPE)<0 then

kullanabilirsin.

Daha karışık şeyler olursa WaitForSingleObject de olur.


neden GetKeyState(VK_ESCAPE)<0 tuş basılı iken ne değer dönüyor ki ?
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#5
Merhaba,
Allah bereket versin, azı çoğu önemli değil. Smile

  private
   FEsc: Boolean;

Uses System.UITypes;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FEsc := False;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
 if Key = VK_ESCAPE then
 begin
   FEsc := True;
   Key := 0;
 end;
end;

Aşağıdaki kodu herhangi bir yerde tetiklemeniz yeterli olacaktır.
  TThread.CreateAnonymousThread(
   procedure
   var
     I: Integer;
   begin
     for I := 0 to integer.MaxValue do
     begin
       TThread.Synchronize(TThread.CurrentThread,
         procedure
         begin
           Memo1.Lines.Add('Items' + inttostr(i));
         end);

       if FEsc then
       begin // Esc tuşuna basıldıysaa
         if MessageDlg('Escye bastın çıkayım mııı yoksa yanlışlıkla mı oldu ?',
           mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
         begin
           FEsc := False;
         end
         else
           Break
       end;
     end;
   end).Start;
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#6
Application.ProcessMessages arayüze nefes aldırır ama sık kullanılması sistemi yoruyor.

Hızlı döngülerde "if döngü mod 1000=0" gibi bir koşulla kullanmak daha iyi olur.

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#7
haklısınız daha önce bu konuyu konuştuk.
Bu da bir çözüm olarak ( sıklığını azaltmak ) sunulmuştu. Hatırlatma için teşekkürler.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#8
(05-09-2018, Saat: 15:25)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba,
Allah bereket versin, azı çoğu önemli değil. Smile

  private
   FEsc: Boolean;

Uses System.UITypes;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FEsc := False;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
 if Key = VK_ESCAPE then
 begin
   FEsc := True;
   Key := 0;
 end;
end;

Aşağıdaki kodu herhangi bir yerde tetiklemeniz yeterli olacaktır.
  TThread.CreateAnonymousThread(
   procedure
   var
     I: Integer;
   begin
     for I := 0 to integer.MaxValue do
     begin
       TThread.Synchronize(TThread.CurrentThread,
         procedure
         begin
           Memo1.Lines.Add('Items' + inttostr(i));
         end);

       if FEsc then
       begin // Esc tuşuna basıldıysaa
         if MessageDlg('Escye bastın çıkayım mııı yoksa yanlışlıkla mı oldu ?',
           mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
         begin
           FEsc := False;
         end
         else
           Break
       end;
     end;
   end).Start;

Böyle bir cevap beklemiyordum Big Grin

Bu da benden,

   
type
  TKey = record
    lo, hi: byte;
  end;

function KeyCtrl(const Key: Integer): Boolean;
VAR
  sm: Smallint;
  bp: PByte;
begin
  sm := GetKeyState(Key);
  bp := @sm;
  Inc(bp);
  Result := TKey(sm).hi = 255;
end;


if KeyCtrl(VK_ESCAPE) then
    begin
   
   end;

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#9
(05-09-2018, Saat: 15:36)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(05-09-2018, Saat: 15:25)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba,
Allah bereket versin, azı çoğu önemli değil. Smile

  private
   FEsc: Boolean;

Uses System.UITypes;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FEsc := False;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
 if Key = VK_ESCAPE then
 begin
   FEsc := True;
   Key := 0;
 end;
end;

Aşağıdaki kodu herhangi bir yerde tetiklemeniz yeterli olacaktır.
  TThread.CreateAnonymousThread(
   procedure
   var
     I: Integer;
   begin
     for I := 0 to integer.MaxValue do
     begin
       TThread.Synchronize(TThread.CurrentThread,
         procedure
         begin
           Memo1.Lines.Add('Items' + inttostr(i));
         end);

       if FEsc then
       begin // Esc tuşuna basıldıysaa
         if MessageDlg('Escye bastın çıkayım mııı yoksa yanlışlıkla mı oldu ?',
           mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
         begin
           FEsc := False;
         end
         else
           Break
       end;
     end;
   end).Start;

Böyle bir cevap beklemiyordum Big Grin

Bu da benden,

   
type
  TKey = record
    lo, hi: byte;
  end;

function KeyCtrl(const Key: Integer): Boolean;
VAR
  sm: Smallint;
  bp: PByte;
begin
  sm := GetKeyState(Key);
  bp := @sm;
  Inc(bp);
  Result := TKey(sm).hi = 255;
end;


if KeyCtrl(VK_ESCAPE) then
    begin
   
   end;


Bildiğin gibi, uzun zamandır beynim multi-platform eksenli çalışmaya başladı. Smile
Kodları tüm platformlarda gönül rahatlığıyla kullanabilirsin.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#10
(05-09-2018, Saat: 15:25)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba,
Allah bereket versin, azı çoğu önemli değil. Smile

  private
   FEsc: Boolean;

Uses System.UITypes;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FEsc := False;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
 if Key = VK_ESCAPE then
 begin
   FEsc := True;
   Key := 0;
 end;
end;

Aşağıdaki kodu herhangi bir yerde tetiklemeniz yeterli olacaktır.
  TThread.CreateAnonymousThread(
   procedure
   var
     I: Integer;
   begin
     for I := 0 to integer.MaxValue do
     begin
       TThread.Synchronize(TThread.CurrentThread,
         procedure
         begin
           Memo1.Lines.Add('Items' + inttostr(i));
         end);

       if FEsc then
       begin // Esc tuşuna basıldıysaa
         if MessageDlg('Escye bastın çıkayım mııı yoksa yanlışlıkla mı oldu ?',
           mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
         begin
           FEsc := False;
         end
         else
           Break
       end;
     end;
   end).Start;

Merhaba,

Yukarıdaki kodda MessageDlg yerine Windows.MessageBox kullanmak gerekiyor. MessageDlg kullandığınız zaman VCL bileşeni kullanmış oluyorsunuz (Application.Message veya ShowMessage fonksiyonlarında da). VCL bileşenleri thread-safe olmadığı için programınız belirsiz davranır ve büyük ihtimalle çöker. Ama Windows.MessageBox fonksiyonunu, ilk parametresi 0 olacak şekilde kullanacak olursanız o zaman sorun olmaz. İlk parametre 0 değilse gene sorun olabilir. Tabii Windows unitini uses kısmına eklediğiniz zaman da her platformda çalışmaz.

Bana soracak olursanız thread içinden kullanıcıya mesaj göstermek doğru değil. Onun yerine thread için bir bekleme mekanizması koymak, kullanıcı ESC düğmesine basınca thread'i beklemeye almak ve soruyu ana programda sormak, sorunun cevabına göre de işlem yapmak daha doğru. Hem bütün platformlarda da çalışır Smile

İyi çalışmalar
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  soru bankasında random ve data çekme sadikacar60 3 307 11-07-2019, Saat: 21:50
Son Yorum: cinarbil
  Tutar kısmındaki soru işareti erdem55 9 1.095 14-11-2018, Saat: 14:19
Son Yorum: edo
  Fikir sahibi olmak istediğim bir soru . Bay_Y 3 757 17-05-2018, Saat: 15:50
Son Yorum: narkotik



Konuyu Okuyanlar: 1 Ziyaretçi