Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Delphi, Excel klasa

[es] :: Pascal / Delphi / Kylix :: Delphi, Excel klasa

[ Pregleda: 968 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
93.140.0.*



+4 Profil

icon Delphi, Excel klasa21.05.2019. u 17:02 - pre 59 meseci
Delphi XE 10.1

Napravio sam klasu i interface za rad za excelom. Moram učitati čeliju koju korisnik odabere (dblclick), kasnije export.
Radi ok, osim jedne stvari: napravio sam OnDblCLick za excel - korisnikov dblclik na čeliju u excel tablici. Ako otvorim 2 excel-a (različiti za različite podatke), svaki ima svoju proceduru za DblClik, DblClik na jednom izvršava obje procedure u Delphi-u ali na aktivno Excelu.
Valjda sam objasnio problem...
KOristim excel2010 i kreiram klasi:

[code]
constructor tExcelClass.Create(FileName: string; Show: boolean);
begin
inherited Create;
LCID := GetUserDefaultLCID;
LCID := LOCALE_USER_DEFAULT;
fCanClose := true;
fExcelApp := TExcelApplication.Create(nil);
fExcelApp.Connect;
fExcelApp.Visible[LCID] := Show;
fFileName := FileName;

if FileName <> '' then fExcelApp.Workbooks.Open(FileName, EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , lcid);
// za xls2000 if FileName <> '' then fExcelApp.Workbooks.Open(FileName, EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , EmptyParam , lcid );

fExcelApp.OnSheetBeforeDoubleClick := self.DblClick;
fExcelApp.OnWorkbookBeforeClose := WorkbookBeforeClose;
fExcelApp.DisplayAlerts[LCID] := false;
fAktCell := tNewCel.Create(self);
fTimer := TTimer.Create(nil);
fTimer.Enabled := false;
fTimer.Interval := 1000;
fTimer.OnTimer := self.Timer1Timer;
fFirstSheetName := (fExcelApp.ActiveWorkbook.ActiveSheet as _WorkSheet).Name;
end;
...
procedure tExcelClass.DblClick(Sender: TObject; const Sh: IDispatch; const Target: ExcelRange; var Cancel: WordBool);
var s: string;
begin
if Assigned(Self.fProcCtrlEnter) then
fProcCtrlEnter(self);
Cancel := True;
end;
[/Code]

Probao sam sa dodjelom fExcelApp.Tag, koja je u proceduri tExcelClass.DblCLick parametar Sender, ali mi se proc. starta za oba excel file-a.
Ima li tko ideju kako znati u kojem excelu je okinut DblClick?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Delphi, Excel klasa22.05.2019. u 09:20 - pre 59 meseci
> Probao sam sa dodjelom fExcelApp.Tag, koja je u proceduri tExcelClass.DblCLick parametar Sender, ali mi se proc.
> starta za oba excel file-a. Ima li tko ideju kako znati u kojem excelu je okinut DblClick?

Fokusiraj se na SH i Target parametre, neki od njih ce dovesti do resenja. Pogledaj Target za pocetak, preko njega mozes da pristupis Application objektu a odatle workbooku tako da saznas koji fajl je otvoren.
Pogledaj: https://docs.microsoft.com/en-...ication%28object%29#properties
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.cust.tele2.hr.



+4 Profil

icon Re: Delphi, Excel klasa22.05.2019. u 21:44 - pre 59 meseci
savkic, hvala na pomoći. ActiveWorkbook je OK ako su u upitanju dva različita excel-a. Ako je u pitanju jedan file koji otvaram radi dohvata različitih podataka (jedan gump - formula, drugi gumb - sadržaj) tada se okinu oba eventa, a tada je isti i ActiveWorbook...

pokušao sam u Create proc. dodati:
Code:

fExcelApp := TExcelApplication.Create(nil);
fExcelApp.Tag := Random(1000);


u svakom objektu tj. interface-u fExceApp dobije drugu vrijednost za Tag, ali mi se proc OnDblClik okine za oba
Code:

   ShowMessage(fExceApp.Tag.ToString);

pikraže se prvi tag, pa onda drugi.

Znači, imam:
Code:

...
public
    ExcelStavka: INewExcel;
    NExcelFormula: INewExcel;
end;
...

procedure MyLcass.Button1Click(Sender)
begin
      ExcelStavka := tExcelClass.Create('NekiExcel.xlsx', true);
      ExcelStavka.ProcDblClick := OnExcelDblUvozStavke;
end;

procedure MyLcass.Button2Click(Sender)
begin
     NExcelFormula := tExcelClass.Create('NekiExcel.xlsx', true);
     NExcelFormula.ProcDblClick := LoadExcelFormula;
end;


Na oba gumba otvaram isti excel file. U prethodnom postu je konstruktor tExcelClass.Create
Mogao bih problem riješiti tako da u public varijabli unita pamtim koji button je pritisnut za aktiviranje excel-a, a u obje procedure provjeravati vrijednost, pa ju izvršiti ili ne. Samo što mi se ne sviđa ta varijanta.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Delphi, Excel klasa22.05.2019. u 23:42 - pre 59 meseci
> ActiveWorkbook je OK ako su u upitanju dva različita excel-a. Ako je u pitanju jedan file koji otvaram radi dohvata
> različitih podataka (jedan gump - formula, drugi gumb - sadržaj) tada se okinu oba eventa, a tada je isti i ActiveWorbook...

Verovatno je to feature Excela, kad primeti da je isti fajl, otvara jedan objekat. Sto ne napravis kopiju tog fajla pa njega otvoris, sadrzaj ce biti isti ali ces dobiti drugu instancu excela.

 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Delphi, Excel klasa

[ Pregleda: 968 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.