tag kullanımı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 353
Kayıt: 05 Oca 2012 12:55

Re: tag kullanımı

Mesaj gönderen xozcanx » 25 Şub 2020 10:57

Kod: Tümünü seç

btnMASA := TButton.Create(FlowPanel1); 
kısmını

Kod: Tümünü seç

btnMASA := TButton.Create(Self);
olarak değiştirip deneyebilir misiniz.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..

erdogan_ozkaya
Üye
Mesajlar: 826
Kayıt: 03 Eki 2007 01:00

Re: tag kullanımı

Mesaj gönderen erdogan_ozkaya » 25 Şub 2020 11:10

budefa da üst üste ekliyor formda :(

erdogan_ozkaya
Üye
Mesajlar: 826
Kayıt: 03 Eki 2007 01:00

Re: tag kullanımı

Mesaj gönderen erdogan_ozkaya » 25 Şub 2020 11:18

buttonu panel yaptım belki farkeder die ama yine aynı bir türlü x butona işlem yapamıyorum


Tpanel hali
unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, cxGraphics, cxControls, cxLookAndFeels,
cxLookAndFeelPainters, cxStyles, cxCustomData, cxFilter, cxData,
cxDataStorage, cxEdit, cxNavigator, dxDateRanges, Data.DB, cxDBData,
Vcl.StdCtrls, Vcl.Mask, Vcl.DBCtrls, cxGridLevel, cxGridCustomTableView,
cxGridTableView, cxGridDBTableView, cxClasses, cxGridCustomView, cxGrid,
DBAccess, Uni, SQLServerUniProvider, UniProvider, ODBCUniProvider,
AccessUniProvider, MemDS, Vcl.ExtCtrls, Vcl.Grids, Vcl.DBGrids, Vcl.Menus,
cxButtons;

type
TForm1 = class(TForm)
srcQRY_SIPARISLER: TUniDataSource;
QRY_RS_MASALAR: TUniQuery;
AccessUniProvider1: TAccessUniProvider;
SQLServerUniProvider1: TSQLServerUniProvider;
DB: TUniConnection;
Button1: TButton;
Button2: TButton;
Button3: TButton;
FlowPanel1: TFlowPanel;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);



type
TPanel = class(Vcl.extCtrls.TPanel)
private
FBilgi: integer;
public
property Bilgi: integer read FBilgi write FBilgi;
end;
private
{ Private declarations }
procedure OnMasaClick(Sender: TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var
MASA: Integer;
btnMASA: TPanel;
begin
for MASA := 1 to QRY_RS_MASALAR.RecordCount do
begin
btnMASA := TPanel.Create(FlowPanel1);
// btnMASA := TPanel.Create(Self);
btnMASA.Parent := FlowPanel1;
btnMASA.Caption := QRY_RS_MASALAR.FieldByName('MASA_ADI').Text;
btnMASA.Height := 100;
btnMASA.Width := 100;
btnMASA.Bilgi:=Self.Tag;
btnMASA.OnClick:=OnMasaClick;
Self.Tag:=Self.Tag + 1;
QRY_RS_MASALAR.Next;
end;
end;


procedure TForm1.OnMasaClick(Sender: TObject);
var
i:integer;
Begin
if Sender is TPanel then
Caption:= TPanel(Sender).Bilgi.ToString;
for i := 0 to ComponentCount-1 do
begin
if (Components is TPanel) AND (TPanel(Components).Tag=10) Then
Begin
TPanel(Components).Caption :='BtnNamexx';
TPanel(Components).Color :=clGreen;
// TButton( Components).Free; // Silmek için..
End;
end;


end;


procedure TForm1.Button2Click(Sender: TObject);
begin
QRY_RS_MASALAR.Open;
QRY_RS_MASALAR.Refresh;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
Begin
if Sender is TPanel then
Caption:= TPanel(Sender).Bilgi.ToString;
for i := 0 to ComponentCount-1 do
begin
if (Components is TPanel) Then
Begin
TPanel( Components).Free; // Silmek için..
End;
end;
end;

end.

ertank
Üye
Mesajlar: 1281
Kayıt: 11 Eyl 2015 11:45

Re: tag kullanımı

Mesaj gönderen ertank » 25 Şub 2020 11:25

erdogan_ozkaya yazdı:
25 Şub 2020 08:46
Arkadaşlar,

aşağıdaki kod ile buton üretiyorum, ürettiğim butonun tag ını buluyorum yapmak istediğim tag ını bulduğum butonun rengini ve adını değiştirmek ?

birde ürettiğim tüm butonları silmek istiyorum ?

Teşekkürler

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  MASA: Integer;
  btnMASA: TButton;
begin
  for MASA := 1 to QRY_RS_MASALAR.RecordCount do
  begin
    btnMASA := TButton.Create(FlowPanel1);
    btnMASA.Parent := FlowPanel1;
    btnMASA.Caption := QRY_RS_MASALAR.FieldByName('MASA_ADI').Text;
    btnMASA.Height := 100;
    btnMASA.Width := 100;
    btnMASA.Info2:=Self.Tag;
    btnMASA.OnClick:=OnMasaClick;
    Self.Tag:=Self.Tag + 1;
    QRY_RS_MASALAR.Next;
  end;
end;


procedure TForm1.OnMasaClick(Sender: TObject);
begin
  if Sender is TButton then
  Caption:= TButton(Sender).Bilgi.ToString;
end;

İlgili kod hatalı. Oluşturulan butonların tag değerini değil Form'un tag değerini değiştiriyor. Doğrusu aşağıdaki gibi olmalı:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  MASA: Integer;
  btnMASA: TButton;
begin
  for MASA := 1 to QRY_RS_MASALAR.RecordCount do
  begin
    btnMASA := TButton.Create(FlowPanel1);
    btnMASA.Parent := FlowPanel1;
    btnMASA.Caption := QRY_RS_MASALAR.FieldByName('MASA_ADI').Text;
    btnMASA.Height := 100;
    btnMASA.Width := 100;
    btnMASA.Info2:=Self.Tag;
    btnMASA.OnClick:=OnMasaClick;
    btnMASA.Tag := MASA;
    QRY_RS_MASALAR.Next;
  end;
end;
Tag bilgisi belli olan Buton rengi değiştirme ile ilgili öncelikle aşağıdaki gibi bir kod yazarsanız kullanımı kolaylaştırmış olursunuz

Kod: Tümünü seç

function TForm1.GetButtonByTag(Parent: TFlowPanel; const Tag: Integer): TButton;
var
  I: Integer;
begin
  for I := 0 to Parent.ComponentCount-1 do
  begin
    if (Parent.Components[I] is TButton) then
      if TButton(Parent.Components[I]).Tag = Tag then
        Exit(TButton(Parent.Components[I]));
  end;
  Result := nil;
end;
Kullanımı aşağıdaki gibi olacaktır:

Kod: Tümünü seç

procedure TForm1.Test();
var
  Buton: TButton;
begin
  Buton := GetButtonByTag(FlowPanel1, 10);
  if Buton <> nil then
  begin
    Buton.Color := clGreen;
  end;
end;
Tag numarası belli olan bir butonu silmek için yine yukarıdaki fonksiyondan faydalanıp aşağıdaki gibi bir kod yazabilirsiniz:

Kod: Tümünü seç

procedure TForm1.Test2();
var
  Buton: TButton;
begin
  Buton := GetButtonByTag(FlowPanel1, 10);
  if Buton <> nil then
  begin
    Buton.Free();
  end;
end;
NOT: Kodlar test edilmedi. Delphi 10.3.3 ile çalışacak şekilde yazıldı.

erdogan_ozkaya
Üye
Mesajlar: 826
Kayıt: 03 Eki 2007 01:00

Re: tag kullanımı

Mesaj gönderen erdogan_ozkaya » 25 Şub 2020 11:47

Hocam Çok teşekkür ederim,

bu kısımı hata veriyor Buton := GetButtonByTag(FlowPanel1, 10);

ertank
Üye
Mesajlar: 1281
Kayıt: 11 Eyl 2015 11:45

Re: tag kullanımı

Mesaj gönderen ertank » 25 Şub 2020 11:53

erdogan_ozkaya yazdı:
25 Şub 2020 11:47
Hocam Çok teşekkür ederim,

bu kısımı hata veriyor Buton := GetButtonByTag(FlowPanel1, 10);
"Hata" olarak çok farklı hatalar mevcut. Derleme zamanında oluşanlardan tutun çalışma zamanında oluşanlara kadar.

1- Sizin karşılaştığınız derleme zamanı hatası mı? Yoksa çalışma zamanı hatası mı?
2- Her halukarda hata mesajı nedir?

erdogan_ozkaya
Üye
Mesajlar: 826
Kayıt: 03 Eki 2007 01:00

Re: tag kullanımı

Mesaj gönderen erdogan_ozkaya » 25 Şub 2020 11:56

hocam, Derleme yaparken alıyorum hatayı

bu satırda takılıyor
Buton := GetButtonByTag(FlowPanel1, 10);



Checking project dependencies...
Compiling Project1.dproj (Debug, Win32)
dcc32 command line for "Project1.dpr"
[dcc32 Error] Unit1.pas(120): E2010 Incompatible types: 'Integer' and 'string'
[dcc32 Error] Unit1.pas(131): E2010 Incompatible types: 'TForm1.TButton' and 'TButton'
[dcc32 Error] Unit1.pas(40): E2065 Unsatisfied forward or external declaration: 'TForm1.TButton.GetButtonByTag'
[dcc32 Fatal Error] Project1.dpr(5): F2063 Could not compile used unit 'Unit1.pas'
Failed
Elapsed time: 00:00:01.7

ertank
Üye
Mesajlar: 1281
Kayıt: 11 Eyl 2015 11:45

Re: tag kullanımı

Mesaj gönderen ertank » 25 Şub 2020 12:45

İlk hata aşağıdaki. Unit1.pas içinde 20 numaralı satırda. Bu satırda ne yazılı bilmiyorum. Ancak Integer değişken/değer olması gereken yerde string var gözüküyor.

Kod: Tümünü seç

[dcc32 Error] Unit1.pas(120): E2010 Incompatible types: 'Integer' and 'string'
İkinci hata sınıf eşleşme hatası (type mismatch). Kod içinde bir yerlerde "TForm1.TButton" şeklinde bir sınıf tanımlanmış ve "TButton" kullanılması gereken yerde kullanılmış. Derleyici TForm1.TButton ve TButton sınıflarını farklı görüyor.

Kod: Tümünü seç

[dcc32 Error] Unit1.pas(131): E2010 Incompatible types: 'TForm1.TButton' and 'TButton'
Son hata ise "TForm1.TButton.GetButtonByTag" tanımlanmış ancak ilgili kodu bulunamamış. "implementation" kısmında bu TForm1.TButton sınıfına ait bir GetButtonByTag yok.

Benim yukarıdakilerden anladığım siz form içinde TButton sınıfından türeme bir TForm1.TButton sınıfı tanımladınız. Örnek olarak verilen kodu buna uyarlamadınız.

Cevapla