Arsip: Kembali ke form sebelumnya...

 
user image
more 13 years ago

Random

Misalkan ada 3 form, yakni : - Form Daftar Kota - Form Master Karyawan - Form Proyek Nah, bila Master Karyawan dan Proyek itu sama-sama ngebuka Form Daftar Kota, gimana caranya Form Daftar Kota tau kalo dia mau balikin nilai ke Master Karyawan atau Proyek ? Saya coba niru cara yang saya gunakan sebelumnya (array of component), kayaknya ga bisa...
public { Public declarations } query : array of TADOQuery; query[1] := FindComponent('qryA') as TADOQuery; query[2] := FindComponent('qryB') as TADOQuery;
trus...
edID.Text := dtmEmployee.query[qryno].FieldValues['name'];
trus saya ubah jadi... form[1] := FindComponent('frmA') as TForm; form[2] := FindComponent('frmB') as TForm; -> kayaknya kalo ditrace disini pun, ga ada nilainya... sehingga yang ini ga jalan (undeclared identifier : 'form' ) : form[formno].ClearItemMenu; Mohon bantuannya...
user image
more 13 years ago

belajaraja

salam, maaf mas, saya kuramh ngerti, maksudnya mau balikin nilai tuh apa ? apa update data ? makasih
user image
more 13 years ago

DelphiExpert

simple aja... tinggal tambahi sebuah variable ber-type TForm pada FormDaftarKota, selanjutnya untuk memudahkan penggunaan, buat method helper untuk membuat & menampilkan FormDaftarKota tsb.

TFormDaftarKota = class(TForm)
  procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
  Caller: TForm;
public
  class function ShowForm(Caller: TForm; ShowModal: Boolean): Boolean;
end;
implementation
class function TFormDaftarKota.ShowForm(Caller: TForm; ShowModal: Boolean): Boolean;
var Form: TFormDaftarKota;
begin
  Result:= not ShowModal;
  Form:= TFormDaftarKota.Create(nil);
  try
    Form.Caller:= Caller;
    
    if ShowModal then 
      Result:= Form.ShowModal = mrOK
    else Form.Show;
  finally
    if ShowModal then Form.Free;
  end;
end;
procedure TFormDaftarKota.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if ModalResult <> mrOK then Exit; // check modal
  // kita punya pointer yg merujuk ke form pemanggil, untuk membedakan tinggal cek class pakai
  // operator IS
  if Caller is TMasterKaryawan then
    TMasterKaryawan(Caller).xxx // do change/notify values
  else if Caller is TProyek then
    TProyek(Caller).xxx // do change/notify values
end;
penggunaannya simple:

procedure TMasterKaryawan.Buton1Click(Sender: TObject);
begin
  if TFormDaftarKota.ShowForm(Self, True) then
    // do something if data was updated
end;
user image
more 13 years ago

Random

Yang bagian ini : if Caller is TMasterKaryawan then TMasterKaryawan(Caller).xxx // do change/notify values else if Caller is TProyek then TProyek(Caller).xxx // do change/notify values Kalo misalkan ada 20 baris kode, dan banyak form yang terlibat, maka jadinya kayak gini ga : if Caller is TMasterKaryawan then begin TMasterKaryawan(Caller).xxx // do change/notify values ...dst sampe baris 20 end else if Caller is TProyek then begin TProyek(Caller).xxx // do change/notify values ...dst sampe baris 20 end else if Caller is TSomething then begin TSomething(Caller).xxx ...dst sampe baris 20 end else if Caller is TSomethingElse then begin TSomethingElse(Caller).xxx ...dst sampe baris 20 end; Nah, yang saya coba lakukan itu gimana caranya kalo ada form lain yang terlibat nantinya, ga usah nambah baris kode lagi. Itu sebabnya saya nyari-nyari sesuatu yang identik dengan array of component di atas. Gimana ya kira-kira ?
user image
more 13 years ago

Random

@belajaraja : Err, kayaknya judul topik yang saya buat dan penjelasannya kurang akurat. Yang saya maksudkan bukan membalikkan nilai sih, tapi gimana caranya form yang dipanggil untuk mengakses component atau variabel apapun yang ada di form pemanggil, dengan baris kode yang sama.
user image
more 13 years ago

DelphiExpert

@Random: tergantung apa yg hendak anda lakukan terhadap form caller tsb. seperti apakah hendak merubah isi sebuah field, table, control dll. Pada event OnClose tsb. hanya sebagai contoh. tergantung bagaimana anda men-generalisir permasalahan. saran saya agar berlaku untuk semua form (caller), buat class khusus bertipe TForm. komponen didalamnya harus general alias pasti akan dipakai oleh setiap turunan form tersebut. atau untuk simple abstract-nya buat sebuah form kosong terus tambahkan sebuah method utk melakukan sesuatu terhadap feedback yg diberikan TFormDaftarKota. method tersebut dibuat dinamis/virtual sehingga dapat di override oleh class turunannya yg pasti berperilaku tidak sama menanggapi feedback dari TFormDaftarKota. tidak perlu dibuat dalam array. teknik ini lebih bagus & dijamin lebih bersifat general. contoh:

type
  TCustomNotifiedForm = class(TForm)
  public
    procedure DoNotifyHandle(Sender: TObject; Params: array of Variant); virtual; // bisa juga ditandai sebagai abstract;
  end;
implementation
procedure TCustomNotifiedForm.DoNotifyHandle(Sender: TObject; Params: array of Variant);
begin
  // do nothing here
end;
contoh turunan class untuk form Master Karyawan:

type
  TMasterKaryawanForm = class(TCustomNotifiedForm)
  public
    procedure DoNotifyHandle(Sender: TObject; Params: array of Variant); override;
  end;
implementation
procedure TMasterKaryawanForm.DoNotifyHandle(Sender: TObject; Params: array of Variant); 
begin
  // do something here (it's all depend on your concept how to apply the parameters)
  // misal memproses event dari TFormDaftarKota:
  
  if Sender is TFormDaftarKota then
  begin
    // do something with your form's content, use params if required
 
    // misal anda menetapkan param 0 adalah PK dari table Kota:
    TableX.Filter:= Format('Kota_ID = %d', [Params[0]]);
    TableX.Filtered:= True;
  end;
end;
sedang dalam TFormDaftarKota pada event OnClose (tidak harus di event ini anda men-triger event); akan menjadi seperti berikut:

procedure TFormDaftarKota.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if ModalResult <> mrOK then Exit; // check jika dalam mode modal result
 
  // kita punya pointer yg merujuk ke form pemanggil
  if Caller is TCustomNotifiedForm then
    TCustomNotifiedForm(Caller).DoNotifyHandle(Self, ); // masukkan hasil dialog ke dalam params jika dibutuhkan
  
  // misal anda menetapkan param 0 adalah PK dari table Kota:
  // TCustomNotifiedForm(Caller).DoNotifyHandle(Self, .AsInteger]);
end;
semoga dipahami :mrgreen:
more ...
  • Pages:
  • 1
Share to
Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com