我喜歡通過單擊按鈕來更改 TGridPanel 中的行順序。Gridpanel 行是動態創建的,并包含一個帶有手動停靠表單的面板。表單有自己的編輯組件和帶有當前行索引的標簽。最好的方法是這樣的:
- 通過單擊標記該行
- 單擊“向上”或“向下”按鈕。
- 所選行向上/向下移動。
- 行的索引在停靠形式中發生變化。
這是我的嘗試:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
GridPanel1->RowCollection->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn_StepAddClick(TObject *Sender)
{
GridPanel1->RowCollection->BeginUpdate();
if (GridPanel1->RowCollection->Count > 0)
GridPanel1->Height = GridPanel1->Height 156;
TRowItem * RowItem = GridPanel1->RowCollection->Add();
RowItem->SizeStyle = ssAbsolute;
RowItem->Value = 156;
TPanel * Panel2 = new TPanel(this);
Panel2->Parent = GridPanel1;
Panel2->Color = clWhite;
Panel2->Name = "Panel" IntToStr(GridPanel1->RowCollection->Count) "2";
Panel2->Align = alClient;
Panel2->AlignWithMargins = false;
TForm2 * Form2 = new TForm2(this, GridPanel1->RowCollection->Count);
Form2->ManualDock(Panel2, Panel2, alClient);
Form2->Show();
BitBtn_StepDelete->Enabled = true;
GridPanel1->RowCollection->EndUpdate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn_StepDeleteClick(TObject *Sender)
{
// at the moment this button deletes the last row in GridPanel. But it would be fine to select a row by clicking it and delete the selected one.
// After deleting it, the titles of the manually docked forms should change
GridPanel1->RowCollection->BeginUpdate();
GridPanel1->ControlCollection->Delete(GridPanel1->ControlCollection->Count - 1);
GridPanel1->RowCollection->Delete(GridPanel1->RowCollection->Count - 1);
if (GridPanel1->RowCollection->Count > 0)
GridPanel1->Height = GridPanel1->Height - 156;
else
BitBtn_StepDelete->Enabled = false;
GridPanel1->RowCollection->EndUpdate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn_StepInsertClick(TObject *Sender)
{
// Select a row by clicking it and then add a new row before
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn_StepUpClick(TObject *Sender)
{
// Select a row by clicking it and move it up by this button click
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn_StepDownClick(TObject *Sender)
{
// Select a row by clicking it and move it down by this button click
}
//---------------------------------------------------------------------------
有沒有人有想法?
uj5u.com熱心網友回復:
這是一個MoveUp按鈕單擊處理程式的 Delphi 實作。它取決于SelRowId: integer保存當前選定行索引的變數,如果沒有選擇,則為 -1。
它不會移動行,而是將內容(例如面板)從一個單元格移動到另一個單元格。
procedure TForm39.MoveUpBtnClick(Sender: TObject);
var
NewRowId: integer;
begin
GridPanel1.RowCollection.BeginUpdate;
if InRange(SelRowId, 1, GridPanel1.ControlCollection.Count-1) then
begin
NewRowId := SelRowId - 1;
GridPanel1.ControlCollection.ControlItems[0,SelRowId].Row := NewRowId;
SelRowId := NewRowId;
end;
GridPanel1.RowCollection.EndUpdate;
end;
該MoveDown程式在其他方面類似,但考驗SelRowId就是
if InRange(SelRowId, 0, GridPanel1.ControlCollection.Count-2)
和分配NewRowId是
`NewRowId := SelRowId 1;`
SelRowId 必須初始化為 -1,并在未選擇任何面板時設定為 -1。
我在我的測驗應用程式中假設單擊面板...
// Clicking a panel
// - deselects the panel if it was previously selected
// - deselects any other previously selected panel in preparation to:
// - selects the panel if it was not previously selected
在我的測驗應用程式中,我分兩步獲取選定的面板行:
通過獲取面板的索引
ControlCollection.IndexOf(panel)從 ControlCollection[indx] 獲取行
var
indx: integer;
Panel: TPanel;
Panel := Sender as TPanel;
{...}
indx := TGridPanel(Panel.Parent).ControlCollection.IndexOf(Panel);
SelRowId := TGridPanel(Panel.Parent).ControlCollection[indx].Row;
我的測驗專案的完整實作在這里:
implementation
{$R *.dfm}
uses Math;
procedure TForm39.FormCreate(Sender: TObject);
begin
SelRowId := -1;
end;
procedure TForm39.MoveUpBtnClick(Sender: TObject);
var
NewRowId: integer;
begin
GridPanel1.RowCollection.BeginUpdate;
if InRange(SelRowId, 1, GridPanel1.ControlCollection.Count-1) then
begin
NewRowId := SelRowId - 1;
GridPanel1.ControlCollection.ControlItems[0,SelRowId].Row := NewRowId;
SelRowId := NewRowId;
end;
GridPanel1.RowCollection.EndUpdate;
end;
procedure TForm39.MoveDnBtnClick(Sender: TObject);
var
NewRowId: integer;
begin
GridPanel1.RowCollection.BeginUpdate;
if InRange(SelRowId, 0, GridPanel1.ControlCollection.Count-2) then
begin
NewRowId := SelRowId 1;
GridPanel1.ControlCollection.ControlItems[0,SelRowId].Row := NewRowId;
SelRowId := NewRowId;
end;
GridPanel1.RowCollection.EndUpdate;
end;
procedure TForm39.AddStepBtnClick(Sender: TObject);
var
NewRow: TRowItem;
P: Tpanel;
begin
GridPanel1.RowCollection.BeginUpdate;
NewRow := GridPanel1.RowCollection.Add;
GridPanel1.Height := GridPanel1.Height 50;
NewRow.SizeStyle := ssAbsolute;
NewRow.Value := 50;
P := Tpanel.Create(self);
P.Caption := 'Panel ' IntToStr(GridPanel1.RowCollection.Count);
P.Align := alClient;
P.AlignWithMargins := False;
P.Parent := GridPanel1;
P.ParentBackground := False;
P.ParentColor := False;
P.Color := Random(256) shl 16 Random(256) shl 8 Random(256);
P.OnClick := PanelClick;
GridPanel1.RowCollection.EndUpdate;
end;
// Clicking a panel
// - selects the panel if it was not previously selected
// - deselects the panel if it was previously selected
// - deselects any other previously selected panel
procedure TForm39.PanelClick(Sender: TObject);
var
indx: integer;
Panel: TPanel;
begin
Panel := Sender as TPanel;
// previously selected panel
if Assigned(SelPanel) then
SelPanel.Color := SavedColor; // reset its color
if SelPanel = Panel then // a second click unselects
begin
SelPanel := nil;
SelRowId := -1;
Exit;
end;
SavedColor := Panel.Color; // save newly selected panels color
Panel.Color := clRed; // set selected color
SelPanel := Panel; // set selected panel
indx := TGridPanel(Panel.Parent).ControlCollection.IndexOf(Panel);
SelRowId := TGridPanel(Panel.Parent).ControlCollection[indx].Row;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/330939.html
標籤:德尔福 时间:2019-05-06 标签:c builder VCL 网格面板
