Edit Box oluşturma
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Edit Box oluşturma
Ben editbox'ları program kodu yazarak oluşturmak istiyorum. Yapmak istediğim şu:
Button1'e bastığımda, herhangi bir editbox'ın (örn editbox1) içine yazdığım sayı kadar editbox oluşturulacak. Ayrıca oluşturulacak editbox'lara düzenli bir caption verilecek. Örn 1. oluşturulan editbox'a X1,
ikinciye Y1 , üçüncüye X2, Dördüncüye Y2 , beşinciye X3 ........
Bu veya buna benzer şekilde bir kod bilen varsa yardımcı olursa sevinirim.
Button1'e bastığımda, herhangi bir editbox'ın (örn editbox1) içine yazdığım sayı kadar editbox oluşturulacak. Ayrıca oluşturulacak editbox'lara düzenli bir caption verilecek. Örn 1. oluşturulan editbox'a X1,
ikinciye Y1 , üçüncüye X2, Dördüncüye Y2 , beşinciye X3 ........
Bu veya buna benzer şekilde bir kod bilen varsa yardımcı olursa sevinirim.
-
- Kıdemli Üye
- Mesajlar: 489
- Kayıt: 13 Eyl 2003 09:10
- Konum: istanbul
- İletişim:
Forma bir adet ComboBox ve bir button ekle
ComboBox in items Property sine 0 dan 10 kadar satır basına sayı ekle
ve
Buttonun click olayına yaz.
basarılar
ComboBox in items Property sine 0 dan 10 kadar satır basına sayı ekle
ve
Buttonun click olayına yaz.
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
var
x:array[0..10] of TEdit;
i:integer;
begin
For i:=0 to ComboBox1.ItemIndex do //secili adet kadar
begin
x[i]:=TEdit.Create(Form1);
x[i].Parent:=Form1;
x[i].Left:=20;
x[i].Top:=(i)*30;
x[i].Width:=100;
x[i].Height:=30;
X[i].text:='Yeni Edit '+inttostr(i); //eklenen yazi (Yeni Edit1)
X[i].Name:='Edit'+inttostr(i); //bilişene verilen ad (Edit1)
end;
end;
Selam...
Sorunuzdaki gibi X1-Y1, X2-Y2, X3-Y3 şeklinde bir isimlendirme yapacaksanız ve de kullanıcının bunu program içerisinden her her an değişiklik yapmasına olanak sağlıyorsan, bu işlemleri programcı olarak senin kontrolünde olmasını sağlamalısın...
- Bunun için @abdulkadir'in kodunu (kendisinin de müsaadesiyle) şu şekilde güncellemelisin...
Sorunuzdaki gibi X1-Y1, X2-Y2, X3-Y3 şeklinde bir isimlendirme yapacaksanız ve de kullanıcının bunu program içerisinden her her an değişiklik yapmasına olanak sağlıyorsan, bu işlemleri programcı olarak senin kontrolünde olmasını sağlamalısın...
- Bunun için @abdulkadir'in kodunu (kendisinin de müsaadesiyle) şu şekilde güncellemelisin...
Kod: Tümünü seç
var
x : array[0..10] of TEdit;
i : Integer;
sayac : Integer;
begin
// İlk olarak mevcut -sonradan oluşturulmuş Tag'ı 99 kodlular- editleri bulup free edelim...
i := 0;
Repeat
If Components[i] is TEdit
then If TEdit(Components[i]).Tag = 99 then
begin
Components[i].Free;
Dec(i); // Bileşen sayısı eksildi ya, bir geri adım...
end;
Inc(i);
Until i > ComponentCount-1;
Sayac := 1;
For i:=0 to ComboBox1.ItemIndex do //secili adet kadar
begin
x[i]:=TEdit.Create(Form1);
x[i].Parent:= Form1;
x[i].Left := 20;
x[i].Top := (i)*30;
x[i].Width := 100;
x[i].Height:= 30;
x[i].Tag := 99; // Kullanıcı oluşturmuştur işartetimiz !!!
Case (i mod 2) of // tek mi çift mi sorusu
0:begin
X[i].text:='X'+inttostr(Sayac); //eklenen yazi (X1)
X[i].Name:='X'+inttostr(Sayac); //bilişene verilen ad (X1)
end;
1:begin
X[i].text:='Y'+inttostr(Sayac); //eklenen yazi (Y1)
X[i].Name:='Y'+inttostr(Sayac); //bilişene verilen ad (Y1)
Inc(Sayac);
end;
end; // Case
end;
end;
-
- Kıdemli Üye
- Mesajlar: 489
- Kayıt: 13 Eyl 2003 09:10
- Konum: istanbul
- İletişim:
@abdülkadir
- Hocam estağfirullah... O ne söz... Sizin kodda hata yok ki.
- Sadece @tur42han arkadaşımızın sorusundan, bu seçimi kullanıcıya yaptırma isteği gibi bişey sezinledim. Ayrıca her edit için ikili grup isteği de gözüme çarptı. Ayrıca kullanıcının yapacağı her seçimde programın TEdit'lerin çakışması ihtimalini ortadan kaldırmak için yeniden düzenleyen bir kod ekledim o kadar...
- Size de çalışmalarınızda başarılar...
- Hocam estağfirullah... O ne söz... Sizin kodda hata yok ki.

- Sadece @tur42han arkadaşımızın sorusundan, bu seçimi kullanıcıya yaptırma isteği gibi bişey sezinledim. Ayrıca her edit için ikili grup isteği de gözüme çarptı. Ayrıca kullanıcının yapacağı her seçimde programın TEdit'lerin çakışması ihtimalini ortadan kaldırmak için yeniden düzenleyen bir kod ekledim o kadar...

- Size de çalışmalarınızda başarılar...

Editbox'ları belli bir döngüye sokabilirmiyiz?
Benim yaptığım programda amaç 4000 tane editbox'tan alınan textleri belirli bir düzende başka bir editbox'a yazdırmak (örneğin 4000 editbox içindeki textleri aralarına virgül koyarak başka bir edit box'a yazdırmak). bunun için mesela editbox(i).text gibi veya buna benzer bir döngü yapılabilir mi?
Re: Editbox'ları belli bir döngüye sokabilirmiyiz?
bende 4000 tane editbox kullanımının mantıksız olacağı görüşündeyim...
)
yüksek müsadesiyle mrmcop abimizin kodundan bir alıntı:
bu olay visual basicde vardı (zamanında bende çok kullanmıştımtur42han yazdı: bunun için mesela editbox(i).text gibi veya buna benzer bir döngü yapılabilir mi?

yüksek müsadesiyle mrmcop abimizin kodundan bir alıntı:
Kod: Tümünü seç
x[i].Tag := 99; // Kullanıcı oluşturmuştur
//burda 99 yerine 100+i gibi bir döngüsel değerle editboxlarını oluştur..
Kod: Tümünü seç
// EditBoxDuzenle(EditNo,EditString)
// buna benzer bi kodla fonksiyon oluştur.
//EditNo'i istediğin editboxun tag numarasıyla gönder ve o editboxun textini veya istediğin özelliğini değiştir.
i := 0;
Repeat
If Components[i] is TEdit
then If TEdit(Components[i]).Tag = 100+([b]EditNo[/b]) then
begin
Components[i].text:=[b]EditString[/b];
end;
Inc(i);
Until i > ComponentCount-1;
Sayin tur42han,
Admin'in dedigi gibi bu iste temel bir yontem hatası var kanaatindeyim. Mevcut teknolojik altyapı ile 4000 adet component kullanmaya ihtiyac olmamalı bence. Yani Delphi'yi geliştirenler boyle bir ise teorik olarak musade etseler de pratik olarak bunun kullanılacagını sanırım hic dusunmemişlerdir. Belki form açılamayabilir bile...
Eger yapmak istediginizi sozlu olarak ifade ederseniz farkli bir yontem onerisi gelecektir sanıyorum.
Nitekim bahsettiginiz DBEdit veritabanında kayıtlı bir alanı gostermeye yarar ve belki de sizin verileri 10 alanı olan bir tablo olarak modelleyip 400 kayıt olusturup 10 alan oldugu icin de 10 dbedit ile veya 10 sutunlu bir grid ile gostermek isi cozecektir.
Kolay gelsin...
Admin'in dedigi gibi bu iste temel bir yontem hatası var kanaatindeyim. Mevcut teknolojik altyapı ile 4000 adet component kullanmaya ihtiyac olmamalı bence. Yani Delphi'yi geliştirenler boyle bir ise teorik olarak musade etseler de pratik olarak bunun kullanılacagını sanırım hic dusunmemişlerdir. Belki form açılamayabilir bile...
Eger yapmak istediginizi sozlu olarak ifade ederseniz farkli bir yontem onerisi gelecektir sanıyorum.
Nitekim bahsettiginiz DBEdit veritabanında kayıtlı bir alanı gostermeye yarar ve belki de sizin verileri 10 alanı olan bir tablo olarak modelleyip 400 kayıt olusturup 10 alan oldugu icin de 10 dbedit ile veya 10 sutunlu bir grid ile gostermek isi cozecektir.
Kolay gelsin...
Editbox - Autocad
Yapacağım proje autocad'e bir arazinin profilini çizdirmek. Arazi uzunluğu 50 km veya daha uzun olabilir. arazi üzerinde yapılan ölçümlerde arazinin uzunluğuna göre 2000'e kadar koordinat alınabilir. koordinatlar iki boyutlu yani x ve y olarak alınacaktır. bu yüzden 4000 tane nokta ediyor (2000 tane x ; 2000 tane y). autocad'e gönderme işi ise bir tane editbox ve bir button ile yapılmaktadır. yani benim, bu editbox'ın içine 4000 tane noktayı yazmam gerekiyor. bu editbox içine yazılan ifade olduğu gibi autocad'in komut satırına yazılıyor. yani yazacağım komut aynen şu şekilde olacak :
(line x1,y1 x2,y2 x3,y3 x4,y4 x5,y5 ...) Burada x1,y1, 1.noktanın koordinatları; x2,y2, 2.noktanın ... koordinatlarıdır.Bu şekilde 2000 tane nokta vardır. Editbox'a bu şekilde yerleştirildikten sonra Button'a basılınca çizim autocad'e yaptırılmaktadır.
Aslında beni Autocad'e gönderme programı sınırlıyor. Bir tane editbox olduğundan bütün koordinatları bu editbox'a girmeye çalışıyorum. Autocad'e gönderme yapan program şu şekilde :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComObj;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
Function SendCommand(Cmd: String) : Boolean;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Function GetAcadWindow: HWnd;
var
Acad : OleVariant;
Caption : String;
begin
Acad := GetActiveOleObject('AutoCAD.Application');
Try
Caption := Acad.Caption;
except
on EOleSysError do
begin
Result := 0;
Exit;
end;
end;
Result := FindWindow(Nil, PChar(Caption));
end;
function TForm1.SendCommand(Cmd: String) : boolean;
var
cds: TCopyDataStruct;
wnd, sender : HWND;
s : integer;
pData : array [0..255] of char;
begin;
result := False;
wnd := GetAcadWindow;
sender := Application.Handle;
if wnd <> 0 then
begin
StrPCopy(pData, Cmd + #13);
pData[Length(Cmd)+1] := #0;
cds.dwData := 1;
cds.cbData := SizeOf(pData);
cds.lpData := @pData;
Result := SendMessage(wnd, WM_COPYDATA, Sender, LParam(@cds)) <> 0;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
If Edit1.Text <> '' then
SendCommand(Edit1.Text);
end;
end.
Programda bir tane editbox bir tane de button var. Ya bu programı bir şekilde geliştirmeliyiz ya da bütün koordinatları editbox'a yazdırmalıyız.
Yardımlarınız için teşekkürler.
(line x1,y1 x2,y2 x3,y3 x4,y4 x5,y5 ...) Burada x1,y1, 1.noktanın koordinatları; x2,y2, 2.noktanın ... koordinatlarıdır.Bu şekilde 2000 tane nokta vardır. Editbox'a bu şekilde yerleştirildikten sonra Button'a basılınca çizim autocad'e yaptırılmaktadır.
Aslında beni Autocad'e gönderme programı sınırlıyor. Bir tane editbox olduğundan bütün koordinatları bu editbox'a girmeye çalışıyorum. Autocad'e gönderme yapan program şu şekilde :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComObj;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
Function SendCommand(Cmd: String) : Boolean;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Function GetAcadWindow: HWnd;
var
Acad : OleVariant;
Caption : String;
begin
Acad := GetActiveOleObject('AutoCAD.Application');
Try
Caption := Acad.Caption;
except
on EOleSysError do
begin
Result := 0;
Exit;
end;
end;
Result := FindWindow(Nil, PChar(Caption));
end;
function TForm1.SendCommand(Cmd: String) : boolean;
var
cds: TCopyDataStruct;
wnd, sender : HWND;
s : integer;
pData : array [0..255] of char;
begin;
result := False;
wnd := GetAcadWindow;
sender := Application.Handle;
if wnd <> 0 then
begin
StrPCopy(pData, Cmd + #13);
pData[Length(Cmd)+1] := #0;
cds.dwData := 1;
cds.cbData := SizeOf(pData);
cds.lpData := @pData;
Result := SendMessage(wnd, WM_COPYDATA, Sender, LParam(@cds)) <> 0;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
If Edit1.Text <> '' then
SendCommand(Edit1.Text);
end;
end.
Programda bir tane editbox bir tane de button var. Ya bu programı bir şekilde geliştirmeliyiz ya da bütün koordinatları editbox'a yazdırmalıyız.
Yardımlarınız için teşekkürler.
Admin'in soylediklerine aynen katılıyorum. Olaya bakış açınızı bu şekle donusturmenizde fayda var.. Bir text dosyada koordinatlar tutulur ve oradan okuyup gonderme işini yapabilirsiniz... Hatta sizin kodda zaten Autocad'a gonderme isini yapan SendCommand isimli bir fonksiyon. Yani sizin editbox'lara da ihtiyaciniz yok eger koordinatlar text dosyada var ise oradan okuyup SendCommand komutunu cagirmaniz yeterli. Eger koordinatları el ile girecekseniz de o zaman edit koyarsınız....
Kolay gelsin...
Kolay gelsin...
Array-Editbox
Yapacağım programda koordinatların dışarıdan kullanıcı tarafından girilmesi gerekiyor. bunun için text dosyası görsel olarak pek güzel olmaz sanırım. Şöyle birşey yapılabilir mi: ben editbox'ları döngüye sokmak için her editbox'ı diziye çevirsem (yani (x[1]:=editbox1.text;) şeklinde tanımlasam) daha sonra x şeklinde kullansam nasıl olur? Ayrıca her editbox'ı da diziye atmak bayağı zor olacak. Ne önerirsiniz? Teşekkürler.
-
- Üye
- Mesajlar: 80
- Kayıt: 18 Şub 2004 08:12
- Konum: Fâni bir yerden
- İletişim: