
A mellékelt példaprogram megnyitása előtt a CopyRow.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens DBGrid nevű property-jében választhatjuk ki a kezelendő DBGrid komponenst.
A SpecialDelimiter property-ben választhatjuk ki, hogy tab vagy enter legyen-e az elválasztójel az egyes cellák szövegei között.
procedure TCopyRow.SetSpecialDelimiter(const Value: TSpecialDelimiter);
begin
FSpecialDelimiter := Value;
if FSpecialDelimiter=sdTab then begin
FDelimiter := #9;
end else begin
if FSpecialDelimiter=sdEnter then begin
FDelimiter := #13;
end;
end;
end;
A Delimiter property-ben adhatunk meg egy tetszőleges sztringet, mely a cellák szövegei közé kerül.
procedure TCopyRow.SetDelimiter(const Value: string);
begin
FDelimiter := Value;
FSpecialDelimiter := sdOther;
end;
Másolást a Copy eljárás meghívásával végezhetjük el. Egy ciklus segítségével végigmegyünk a DBGrid oszlopain, majd minden cella tartalmát bemásoljuk egy átmeneti sztringbe.
procedure TCopyRow.Copy;
begin
if Assigned(FDBGrid) then begin
with FDBGrid do begin
for i:=0 to FDBGrid.FieldCount-1 do begin
s:=s+FDBGrid.Fields[i].AsString;
Cellák szövegei közé beillesztjük az elválasztó sztringet, ügyelve arra, hogy az utolsó cella után már ne kerüljön be ez az elválasztó jel.
if i<>FDBGrid.FieldCount-1 then begin
s:=s+FDelimiter;
end;
end;
Végül az átmeneti sztring tartalmát a vágólapra helyezzük.
Clipboard.AsText:=s;
end;
end;
end;
Komponensünket fel kell készíteni egy olyan esetre, amikor a DBGrid property-hez hozzákötött DBGrid komponens törlésre kerül a Form-ról. Ez esetben a Copy eljárást meghívva, az futási hibát okozna, mivel egy nem létező DBGrid-re próbálna hivatkozni. Ennek elkerülése végett felülírjuk a Notification eljárást, mely minden új komponens létrejötte, illetve törlése esetén meghívásra kerül.
procedure TCopyRow.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
Ha azt látjuk, hogy az aktuális művelet törlés, illetve a törlésre kerülő komponens a DBGrid property-ben tárolt, akkor a property-hez tartozó változó értékét törölnünk kell.
if (Operation=opRemove) and (AComponent=FDBGrid) then begin
FDBGrid:=nil;
end;
end;