Динамически ставить флажки в форме - PullRequest
2 голосов
/ 11 августа 2011

У меня есть таблица в БД с информацией о некоторых товарах.Товары могут быть заполняемыми, поэтому мы можем добавить к ним текст.Поэтому я хочу динамически генерировать список флажков, связанных с информацией в таблице, и даже некоторые флажки должны быть с компонентом TEdit, чтобы можно было добавлять текст в этот элемент.Так как я могу это сделать?Какой компонент я должен использовать?Я понял, что TTreeView почти достаточно, но он не позволяет «рисовать» TEdit рядом с флажками.Я использую Delphi 2010. Заранее спасибо!Надеюсь на вашу помощь!

Ответы [ 3 ]

6 голосов
/ 11 августа 2011

Если я правильно прочитал ваш вопрос, вы хотели бы создать некоторые элементы управления в форме на основе содержимого таблицы. В следующем примере я предположил, что вы хотите сделать это на основе содержимого текущей записи в TDBGrid, поэтому вам придется приспосабливаться по мере необходимости.

В этом примере предполагается наличие формы с TDBGrid и TPanel (Panel1), в которых будут храниться элементы управления, созданные во время выполнения.

TDBGrid будет подключен к компоненту TDataSource, который будет подключен к некоторому потомку TDataSet для таблицы / запроса с информацией. TDataSource имеет событие OnDataChanged. Это событие вызывается при изменении данных в поле или при изменении текущей записи в наборе данных. Таким образом, вы можете использовать это для изменения элементов управления при изменении текущей записи.

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var
  i: Integer;
  Chk: TCheckBox;
  Edit: TEdit;
begin
  // When the Field is assigned, the call is the result of a change in the field.
  // When the Field is unassigned, the call is the result of changing the current record.
  if Assigned(Field) then
    Exit;

  // Remove controls on panel
  for i := Panel1.ControlCount - 1 downto 0 do
    Panel1.Controls[i].Free;

  // Add controls on panel for current record
  if True then      // Replace this with condition based on contents of current record (if any!)
  begin
    Chk := TCheckBox.Create(Self);  // Set Owner, so it is freed when form is closed.
    Chk.Parent := Panel1;           // Set Parent, so the control is shown.
    Chk.Left := FLeftIndent;        // Create FLeftIndent as a member field of the form, set value in OnCreate.
    Chk.Top := FNextTop;            // Create FNextTop as a member field of the form.
    Inc(FNextTop, FSpacing);        // Create FSpacing as a member field of the form, set value in OnCreate.

    if True then    // Replace this with condition that dictates creation of Edit
    begin
      Edit := TEdit.Create(Self);
      Edit.Parent := Panel1;
      Edit.Left := Chk.Left + Chk.Width + FSpacing;
      Edit.Top := Chk.Top;          // Add offset as needed for proper alignment of CheckBox and Edit.
    end;
  end;
end;

Пожалуйста, обратите внимание, что если у вас нет других флажков или правок в форме, вам нужно будет включить соответствующие единицы vcl самостоятельно. Самый простой способ сделать это - поместить их в форму, сохранить форму, а затем снова удалить элементы управления.

1 голос
/ 11 августа 2011

try этот пример создания флажка во время выполнения помогает вам динамически изменять позицию. вы можете либо создать новый компонент, который включает в себя флажок с надписью Edit, либо динамически создать TEdit там, где он вам нужен.

Рассмотрите возможность создания массива TCheckbox и одного из TEdit и установите свойство visible каждого редактирования, используя что-то вроде логической функции IsEditNeeded, в которой вы кодируете условия, если поле Edit необходимо.

0 голосов
/ 11 августа 2011

Я бы соблазнился использовать вид сетки, такой как ExGridView, и позволить ему рисовать мои чекбоксы, и делать элементы управления "edit" для каждой строки, для меня. Однако, если вам действительно нужно поле для редактирования, вместо сетки, вы также можете попробовать подход с сеткой элементов управления (1 флажок + 1 элемент управления в сетке элементов управления).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...