Nested Table

General TRichView support forum. Please post your questions here
j&b
Posts: 194
Joined: Mon Sep 05, 2005 1:35 pm

Nested Table

Post by j&b »

Image
Welche URL muss man denn nehmen?


Hello Sergey,
es geht um nested table. Ich möchte gern die Ebene der Tabellen wissen.

Ich habe 1 Tabelle (A) mit 4 Zeilen und 3 Spalten.
In dieser Tabelle (A) habe ich in einer Zelle (3;2) eine weitere Tabelle (B) mit 5 Zeilen und 2 Spalten.

Nun möchte ich folgende Rückmeldungen, wenn ich in eine Zelle (mit der lk. Maustaste) klicke:
-a-: Ich klicke in Tabelle A in cells(2,2). Rückmeldung: enthält keine weitere Tabelle
-b-: Ich klicke in Tabelle A in cells(2,1) unterhalb der Tabelle B. Rückmeldung: enthält EINE Tabelle
-c-: Ich klicke in Tabelle B in eine Zelle. Rückmeldung: Tabelle B liegt in Cells(2,1) der Tabelle A

Mein Ergebnis: Immer 'Caret ist in einer Zelle der Tabelle ... !'

procedure TForm1.sbTesten1Click(Sender: TObject);
var ebene: integer;
begin
if (memo.CanChange) and
(memo.GetCurrentItemEx(TRVTableItemInfo, rve, TCustomRVItemInfo(rveTable))) then begin
Ebene:= GetNestingLevel(rve);
If rve.TopLevelEditor=rve.InplaceEditor then
ShowMessage('Caret ist in einer Zelle der Tabelle ... ! Ebene: '+intToString(ebene));
end;

function TForm1.GetNestingLevel(rve: TCustomRichViewEdit): Integer;
begin
Result := 0;
while rve.InplaceEditor<>nil do begin
inc(Result);
rve := TCustomRichViewEdit(rve.InplaceEditor);
end;
end
Sergey Tkachenko
Site Admin
Posts: 17995
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Nested Table

Post by Sergey Tkachenko »

GetCurrentItemEx returns rve and rveTable, where rve is the editor that contains rveTable.
If rveTable is a table directly in the memo (nesting level 1), the method returns rve = memo.
If the nesting level is 2, the method returns rve = memo.InplaceEditor, and so on.

There are two possible cases:

1. The caret is inside a table cell (and not to the left or right side of another table nested in this cell)
In this case, rve.TopLevelEditor = rve.InplaceEditor is always True, regardless of the nesting level, because rve is the editor directly containing rveTable, and rve.InplaceEditor is the editor of a cell in rveTable.

2. The caret is to the left or right of the table.
In this case, rve.TopLevelEditor = rve is always True, regardless of the nesting level, because rve is the editor that contains this table, and it does not have an InplaceEditor.

Actually, to calculate the nesting level of the current cell, you do not need to access the table itself.
The simple code below should work:

Code: Select all

procedure TForm1.sbTesten1Click(Sender: TObject);
var ebene: integer;
begin
    Ebene:= GetNestingLevel(memo);
    if Ebene >= 0 then
      ShowMessage('Caret ist in einer Zelle der Tabelle ... ! Ebene: '+intToString(ebene))
    else
      ShowMessage('Caret ist nicht in einer Zelle der Tabelle.');
end;

function TForm1.GetNestingLevel(rve: TCustomRichViewEdit): Integer;
begin
  Result := 0;
  while rve.InplaceEditor<>nil do begin
    inc(Result);
    rve := TCustomRichViewEdit(rve.InplaceEditor);
  end;
end


GetCurrentItemEx gibt rve und rveTable zurück, wobei rve der Editor ist, der rveTable enthält.
Wenn rveTable eine Tabelle direkt im Memo ist (Verschachtelungsebene 1), gibt die Methode rve = memo zurück.
Bei Verschachtelungsebene 2 gibt die Methode rve = memo.InplaceEditor zurück, und so weiter.

Es gibt zwei mögliche Fälle:

Der Cursor befindet sich innerhalb einer Tabellenzelle.
In diesem Fall ist rve.TopLevelEditor = rve.InplaceEditor immer True, unabhängig von der Verschachtelungsebene, da rve der Editor ist, der rveTable direkt enthält, und rve.InplaceEditor der Editor einer Zelle von rveTable ist.

Der Cursor befindet sich links oder rechts der Tabelle.
In diesem Fall ist rve.TopLevelEditor = rve immer True, unabhängig von der Verschachtelungsebene, da rve der Editor ist, der diese Tabelle enthält und keinen InplaceEditor besitzt.

Um die Verschachtelungsebene der aktuellen Zelle zu ermitteln, müssen Sie tatsächlich nicht auf die Tabelle selbst zugreifen.
Der einfache Code unten sollte funktionieren:
j&b
Posts: 194
Joined: Mon Sep 05, 2005 1:35 pm

Re: Nested Table

Post by j&b »

Danke Sergey. Mein Problem ist damit gelöst.

Ein anderes Problem habe ich schon seit Jahren:
Wie lädt man ein Bild in dieses Formular?
Ich weiß Image.
Aber welche URL ist gemeint?
Die von einer meiner Cloud oder eine bestimmtes Verzeichnis auf deiner Webseite?
Wenn es eine URL von meiner Cloud sein sollte, ist dann das Image in deinem Forum weg, wenn ich das Image auf meiner Cloud lösche?
Hast du irgendwo beschrieben wie man ein Image einbindet?

MfG
Jürgen
Sergey Tkachenko
Site Admin
Posts: 17995
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Nested Table

Post by Sergey Tkachenko »

You can see two tabs below the message editor: "Options" and "Attachments".
Click the "Attachments" tab. Then clock "Add files" button and select images.
These images will be attached to the message. You have the option to insert them in text.

You can add an external image using [img]URL[/img] syntax. But if the external image becomes unavailable, it will be displayed as a broken image.

-----

Übersetzung ins Deutsche

(Die Beschriftungen der Registerkarten und Schaltflächen wurden möglicherweise nicht korrekt übersetzt.)

Unterhalb des Nachrichteneditors sehen Sie zwei Registerkarten: „Optionen“ und „Anhänge“.

Klicken Sie auf die Registerkarte „Anhänge“. Klicken Sie anschließend auf „Dateien hinzufügen“ und wählen Sie Bilder aus.

Diese Bilder werden der Nachricht angehängt. Sie können sie auch direkt in den Text einfügen.

Sie können ein externes Bild mithilfe der Syntax [img]URL[/img] hinzufügen. Sollte das externe Bild nicht verfügbar sein, wird es als defektes Bild angezeigt.
j&b
Posts: 194
Joined: Mon Sep 05, 2005 1:35 pm

Re: Nested Table

Post by j&b »

Ich habe doch noch eine eine Situation vergessen:
Gibt es eine Funktion "In dieser Zelle liegt eine andere Tabelle", wenn man in der (großen) Tabelle (-b- ist fokusiert) eine entsprechende Funktion (wie z.B. GetNestingLevel) aufruft?
Bild_2025-11-29_180243408.png
Bild_2025-11-29_180243408.png (2.39 KiB) Viewed 169 times
Sergey Tkachenko
Site Admin
Posts: 17995
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Nested Table

Post by Sergey Tkachenko »

If the caret is in the cell -b-, and it is to the left of the right side of the nested table containing -c-, then GetCurrentItemEx will return:
- this nested table in rveTable
- editor of the cell -b- in rve.
This situation can be recognized by checking if rve = memo.TopLevelEditor.

If you just want to know if the active cell contain table, use


Befindet sich der Cursor in Zelle -b- und links vom rechten Rand der verschachtelten Tabelle, die -c- enthält, gibt GetCurrentItemEx Folgendes zurück:
- diese verschachtelte Tabelle in rveTable
- den Editor von Zelle -b- in rve.

Diese Situation lässt sich durch die Prüfung feststellen, ob rve = memo.TopLevelEditor.

Wenn Sie lediglich wissen möchten, ob die aktive Zelle eine Tabelle enthält, verwenden Sie

Code: Select all

function HasTable(rve: TCustomRichViewEdit): Boolean;
var
  i: Integer;
begin
  Result := True;
  for i := 0 to rve.ItemCount -1 do
    if rve.GetItem(i) is TRVTableItemInfo then
      exit;
  Result := False;
end;
Call:

Code: Select all

  if HasTable(rve.TopLevelEditor) then ..,
j&b
Posts: 194
Joined: Mon Sep 05, 2005 1:35 pm

Re: Nested Table

Post by j&b »

Danke! :D :idea:
j&b
Posts: 194
Joined: Mon Sep 05, 2005 1:35 pm

Re: Nested Table - Zeile einfügen

Post by j&b »

{
Tabellenzeile einfügen ---> geht in rve-Tabellen mit Ebene 1
Tabellenzeile löschen ----> habe ich hinbekommen (siehe weiter unten - nur 1 Code-Zeile)

Wie kann man die procedure tbZeiEinfgClick so ergänzen/ändern, dass sie auch auf nested tables (Ebene 2) macht?
}

Code: Select all

procedure TForm1.tbZeiEinfgClick(Sender: TObject);
var wahl,r,c,itemNo,data,anz: integer;
    item: TCustomRVItemInfo;
    s: string;
    fVonvorn: boolean;
    label vvorn;
begin
  fVonVorn:= false;

vvorn:
  memo.setfocus;
  if (not memo.CanChange) or (not memo.GetCurrentItemEx(TRVTableItemInfo, rve, TCustomRVItemInfo(rveTable))) then begin
     showMessage('Geht nicht !'+#10+'Tabelle muss den Fokus besitzen.');
     exit;
  end;

  if fVonVorn= false then begin
    fZeileEinfuegen:=TfZeileEinfuegen.Create(Application);
    with fZeileEinfuegen do begin
      Edit1.text:= '1';
      uZeinfgWahl:= 1;
    showModal;
      wahl:=rg1.ItemIndex;
      anz:= strToInt(Edit1.text);
      if anz< 1 then anz:= 1;
      release;
    end;
    if wahl= -1 then exit;
  end;

  memo.GetCurrentItemEx(TRVTableItemInfo, rve, item);
  if rve=nil then begin ShowMessage('Geht nicht !'+#10+'Die Tabelle muss den Fokus besitzen.'); exit; end;
  rveTable := TRVTableItemInfo(item);
  ItemNo := memo.GetItemNo(rveTable);   //code from Editor 1
  memo.BeginItemModify(ItemNo, Data);
  rve:=rveTable.GetEditedCell(r,c);

  if fVonVorn= false then begin
    if wahl=0 then s:= 'oberhalb' else if wahl=1 then s:= 'unterhalb';
  end;

  if Memo.SelectionExists=false then begin
    rveTable.GetEditedCell(r,c);
    rveTable.Select(r,0,0,rveTable.colcount-1);
    memo.EndItemModify(ItemNo, Data);
    memo.Change;
    fVonVorn:= true;
    goto vvorn;
  end;
  fVonVorn:= false;

  if MessageDlg('Wollen Sie wirklich  '+intToStr(anz)+'  Zeile(n) '+s+' der aktuellen Zeile einfügen ?',
     mtConfirmation, [mbYes,mbNo],0) = mrNo then begin
     memo.Deselect;
     exit;
  end;

  if wahl=0 then rveTable.InsertRowsAbove(anz)         //anz = 1
  else if wahl=1 then rveTable.InsertRowsBelow(anz);

  memo.EndItemModify(ItemNo, Data);
  memo.Change;
end;   //of .tbZeiEinfgClick





//Zeile löschen

procedure TForm1.tbZeiDelClick(Sender: TObject);
var r,c,rs,cs,itemNo,data: integer;
    item: TCustomRVItemInfo;
begin
  if query1.state in [dsEdit, dsInsert] then query1.post;
  if (not memo.CanChange) or (not memo.GetCurrentItemEx(TRVTableItemInfo, rve, TCustomRVItemInfo(rveTable))) then begin
     showMessage('Geht nicht !'+#10+'Tabelle muss den Fokus besitzen.');
     exit;
  end;

  memo.GetCurrentItemEx(TRVTableItemInfo, rve, item);
  if rve=nil then begin ShowMessage('Geht nicht !'+#10+'Tabelle muss den Fokus besitzen.'); exit; end;
  rveTable := TRVTableItemInfo(item);
  ItemNo := memo.GetItemNo(rveTable); 
  if GetNestingLevel(memo)= 2 then itemno:= 4;   //mit itemNo:= 0 ginge auch, aber bestimmt besser  ####################################
  memo.BeginItemModify(ItemNo, Data);

  rveTable.GetNormalizedSelectionBounds(true, rveTzeile1,rveTspalte1,cs,rs);
  rve:=rveTable.GetEditedCell(r,c);

  if Memo.SelectionExists=false then rveTable.SelectRows(r,1);
  if MessageDlg('Wollen Sie diese Zeile(n) entfernen ?',
     mtConfirmation, [mbYes,mbNo],0) = mrNo then begin
     memo.Deselect; exit;
  end else begin
    if rs<rveTable.rowCount then begin
      rveTable.DeleteSelectedRows;
      memo.EndItemModify(ItemNo, Data);
      memo.Change;
      if query1.state in [dsEdit, dsInsert] then query1.post;
    end; // else TabelleLoeschenClick(Self);
  end;
end;
j&b
Posts: 194
Joined: Mon Sep 05, 2005 1:35 pm

Re: Nested Table

Post by j&b »

Ich denke, ich habe das Problem gelöst.

procedure TForm1.sbTesten2Click(Sender: TObject);
var wahl, anz, itemNo: integer;
begin
if GetNestingLevel(memo)= 2 then begin
//if fVonVorn= false then begin
wahl:= 1; anz:= 1; //ItemNo:= 4;
fZeileEinfuegen:=TfZeileEinfuegen.Create(Application);
with fZeileEinfuegen do begin
Edit1.text:= '1';
uZeinfgWahl:= 1;
showModal;
wahl:=rg1.ItemIndex;
anz:= strToInt(Edit1.text);
if anz< 1 then anz:= 1;
release;
end;
if wahl= -1 then exit;
//end;

if (memo.CanChange) and
(memo.GetCurrentItemEx(TRVTableItemInfo, rve, TCustomRVItemInfo(rveTable))) then begin
if wahl=0 then rveTable.InsertRowsAbove(anz) //anz = 1
else if wahl=1 then rveTable.InsertRowsBelow(anz);

memo.change;
memo.format;
end;
end;

end;
j&b
Posts: 194
Joined: Mon Sep 05, 2005 1:35 pm

Re: Nested Table

Post by j&b »

In der

procedure TForm1.tbZeiDelClick(Sender: TObject);

heißt es an der Stelle

if GetNestingLevel(memo)> 1 then begin

besser (sicherer)

if HasTable(rve.TopLevelEditor) then itemno:= 4;
Sergey Tkachenko
Site Admin
Posts: 17995
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Nested Table - Zeile einfügen

Post by Sergey Tkachenko »

j&b wrote: Mon Dec 01, 2025 11:42 am {
Tabellenzeile einfügen ---> geht in rve-Tabellen mit Ebene 1
Tabellenzeile löschen ----> habe ich hinbekommen (siehe weiter unten - nur 1 Code-Zeile)

Wie kann man die procedure tbZeiEinfgClick so ergänzen/ändern, dass sie auch auf nested tables (Ebene 2) macht?
}
The main problem in this code - using "ItemNo" of "rveTable"'s in "memo".
It works when "rveTable" is inserted directly in "memo", but does not work when "rveTable" is in a table cell.

In all places, instead of memo.GetItemNo, memo.BeginItemModify, memo.EndItemModify, memo.Change you must use rve.GetItemNo, rve.BeginItemModify, rve.EndItemModify, rve.Change.

Also, remove the line rve:=rveTable.GetEditedCell(r,c) to prevent changing rve in your code.


Das Hauptproblem in diesem Code ist die Verwendung von „ItemNo“ aus „rveTable“ in „memo“.
Es funktioniert, wenn „rveTable“ direkt in „memo“ eingefügt wird, aber nicht, wenn sich „rveTable“ in einer Tabellenzelle befindet.

Verwenden Sie daher anstelle von memo.GetItemNo, memo.BeginItemModify, memo.EndItemModify und memo.Change überall rve.GetItemNo, rve.BeginItemModify, rve.EndItemModify und rve.Change.

Entfernen Sie außerdem die Zeile rve:=rveTable.GetEditedCell(r,c), um zu verhindern, dass rve in Ihrem Code verändert wird.
j&b
Posts: 194
Joined: Mon Sep 05, 2005 1:35 pm

Re: Nested Table

Post by j&b »

Image

Wenn man in Tabelle 1 NICHT alle Zellen einer 'nested Tabelle markiert' und diese dann per Button (procedure TForm1.tbZeiDelClick(Se) löscht, erhält man das erwartete Ergebnis (Tabelle 2). Beachte in Tabelle 2, dass kein Zeichen bei Y (oberhalb der restlichen Tabelle) zu sehen ist.
Markiert man in Tabelle 3 ALLE Zellen einer 'nested Tabellet' und löschte diese per Button (procedure TForm1.tbZeiDelClick(Se), wird die Tabelle (4) gelöscht.. Beachte in Tabelle 4, dass jetzt ein Zeichen bei X zu sehen ist. Dieses muss man per Hand löschen. Es ist also 'noch was da'.
Alles geht bis auf den 'Punkt', der natürlich ebenfalls verschwinden muss.

Was tun?


Hier nun meine durch dich korrigierte Prozedure:

procedure TForm1.tbZeiDelClick(Sender: TObject);
var r,c,rs,cs,itemNo,data: integer;
item: TCustomRVItemInfo;
begin
if query1.state in [dsEdit, dsInsert] then query1.post;
if (not memo.CanChange) or (not memo.GetCurrentItemEx(TRVTableItemInfo, rve, TCustomRVItemInfo(rveTable))) then begin
showMessage('Geht nicht !'+#10+'Tabelle muss den Fokus besitzen.');
exit;
end;

memo.GetCurrentItemEx(TRVTableItemInfo, rve, item);
if rve=nil then begin ShowMessage('Geht nicht !'+#10+'Tabelle muss den Fokus besitzen.'); exit; end;
rveTable := TRVTableItemInfo(item);
ItemNo := rve.GetItemNo(rveTable
if (GetNestingLevel(memo)> 1) and (HasTable(rve.TopLevelEditor)) then itemno:= 4;
//if GetNestingLevel(memo)> 1 then itemno:= 4;
//if HasTable(rve.TopLevelEditor) then itemno:= 4; //Siehe tbZeiEinfgClick --> if GetNestingLevel(memo) > 1 //then

rve.BeginItemModify(ItemNo, Data);
rveTable.GetNormalizedSelectionBounds(true, rveTzeile1,rveTspalte1,cs,rs);
//rve:=rveTable.GetEditedCell(r,c);

if Memo.SelectionExists=false then rveTable.SelectRows(r,1);
if MessageDlg('Wollen Sie diese Zeile(n) entfernen ?', mtConfirmation, [mbYes,mbNo],0) = mrNo then begin
memo.Deselect; exit;
end else begin
if rs<=rveTable.rowCount then begin
rveTable.DeleteSelectedRows;
rve.EndItemModify(ItemNo, Data); //memo
rve.Change; //memo
end;
end;
if query1.state in [dsEdit, dsInsert] then query1.post;
end;
j&b
Posts: 194
Joined: Mon Sep 05, 2005 1:35 pm

Re: Nested Table2

Post by j&b »

Image
Nested Tables2.png
Nested Tables2.png (8.56 KiB) Viewed 62 times
Sergey Tkachenko
Site Admin
Posts: 17995
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: Nested Table

Post by Sergey Tkachenko »

If you delete all rows (or all columns) of the table, the resulting table will have 0 rows and 0 columns. It is by design.
To avoid this situation, check if the all rows/columns are deleted. If all of them, then, instead of deleting rows/columns, delete the whole table.
See the code in Editor 1 demo:


Wenn Sie alle Zeilen (oder alle Spalten) der Tabelle löschen, enthält die resultierende Tabelle 0 Zeilen und 0 Spalten. Dies ist so vorgesehen.

Um dies zu vermeiden, prüfen Sie, ob alle Zeilen/Spalten gelöscht wurden. Falls ja, löschen Sie die gesamte Tabelle, anstatt nur einzelne Zeilen/Spalten zu löschen.
Siehe den Code in der Demo „Editor 1“:

Code: Select all

  
    5: // deleting selected rows
      begin
        table.GetNormalizedSelectionBounds(True, r, c, cs, rs);
        if rs = table.RowCount then
        begin
          // deleting the whole table
          rve.SetSelectionBounds(ItemNo, 0, ItemNo, 1);
          rve.DeleteSelection;
          exit;
        end;
        rve.BeginUndoGroup(rvutModifyItem);
        rve.SetUndoGroupMode(True);
        table.DeleteSelectedRows;
        // it's possible all-nil rows/cols appear after deleting
        table.DeleteEmptyRows;
        table.DeleteEmptyCols;
        rve.SetUndoGroupMode(False);
      end;
    6: // deleting selected columns
      begin
        table.GetNormalizedSelectionBounds(True, r, c, cs, rs);
        if cs = table.ColCount then
        begin
          // deleting the whole table
          rve.SetSelectionBounds(ItemNo, 0, ItemNo, 1);
          rve.DeleteSelection;
          exit;
        end;
        rve.BeginUndoGroup(rvutModifyItem);
        rve.SetUndoGroupMode(True);
        table.DeleteSelectedCols;
        // it's possible all-nil rows/cols appear after deleting
        table.DeleteEmptyRows;
        table.DeleteEmptyCols;
        rve.SetUndoGroupMode(False);
      end;
j&b
Posts: 194
Joined: Mon Sep 05, 2005 1:35 pm

Re: Nested Table - Endfassung (hoffentlich)

Post by j&b »

Danke Sergey. Deine Hinweise haben mir sehr geholfen.
Ich habe es mit4-fach verschachtelten Tabellen probiert. Einzelne, mehrere Zellen lassen sich jetzt fehlerfrei löschen.
Für den Fall, dass Jemand die durch deine Hilfe fertiggestellt Procedure haben will, kopiere ich sie (hoffentlich) letzmalig in dieses Memo:

procedure TForm1.tbZeiDelClick(Sender: TObject);
var r,c,rs,cs,itemNo,data: integer;
item: TCustomRVItemInfo;
begin
if query1.state in [dsEdit, dsInsert] then query1.post;
if (not memo.CanChange) or (not memo.GetCurrentItemEx(TRVTableItemInfo, rve, TCustomRVItemInfo(rveTable))) then begin
showMessage('Geht nicht !'+#10+'Tabelle muss den Fokus besitzen.');
exit;
end;

memo.GetCurrentItemEx(TRVTableItemInfo, rve, item);
if rve=nil then begin ShowMessage('Geht nicht !'+#10+'Tabelle muss den Fokus besitzen.'); exit; end;
rveTable := TRVTableItemInfo(item);
ItemNo := rve.GetItemNo(rveTable);
if (GetNestingLevel(memo)> 1) and (HasTable(rve.TopLevelEditor)) then itemno:= 4;
//if GetNestingLevel(memo)> 1 then itemno:= 4;
//if HasTable(rve.TopLevelEditor) then itemno:= 4; //Siehe tbZeiEinfgClick --> if GetNestingLevel(memo) > 1 then

rve.BeginItemModify(ItemNo, Data);
rveTable.GetNormalizedSelectionBounds(true, rveTzeile1,rveTspalte1,cs,rs);
if Memo.SelectionExists=false then rveTable.SelectRows(rveTzeile1,1)
else rveTable.selectRows(rveTzeile1,rs);

if MessageDlg('Wollen Sie diese Zeile(n) entfernen ?',
mtConfirmation, [mbYes,mbNo],0) = mrNo then begin
memo.Deselect; exit;

end else begin
if rs<rveTable.rowCount then begin
rveTable.DeleteSelectedRows;
rve.EndItemModify(ItemNo, Data);
rve.Change;

end else begin
if memo.GetCurrentItemEx(TRVTableItemInfo, rve, TCustomRVItemInfo(rveTable)) then begin
rve.SetSelectionBounds(rveTable.GetMyItemNo, 0, rveTable.GetMyItemNo, 1);
if MessageDlg('Soll die (ganze) Tabelle wirklich gelöscht werden ?', mtConfirmation, [mbYes,mbNo],0) = mrNo then begin
rve.deSelect; exit;
end;
rve.DeleteSelection;
end;
rve.BeginUndoGroup(rvutModifyItem);
rve.SetUndoGroupMode(True);
//bereits weiter oben gelöscht - rvetable.DeleteSelectedRows; //bzw. rvetable.DeleteSelectedCols;
rvetable.DeleteEmptyRows; //bzw. rvetable.DeleteSelectedCols;
//Es ist möglich, dass nach dem Löschen alle Zeilen/Spalten leer sind.
//rvetable.DeleteEmptyCols;
//rvetable.DeleteEmptyCols;
rve.SetUndoGroupMode(False);
end;
end;
if query1.state in [dsEdit, dsInsert] then query1.post;
end; //of .tbZeiDelClick
Post Reply