Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  07:51[Войти] | [Зарегистрироваться]
Ответ на вопрос № 60379

18-03-2008 17:07
Здравствуйте жители Королевства!
Возник такой вопрос:
Когда мы ставим на форму ComboBox и AutoDropDown=True то когда вводиш значение идет последовательно выбор из Items ComboBox -a. А когда заганяю Combobox в StirngGrid то этого выбора нет. (Вот код как ComboBox в StringGrid - е).

procedure TForm1.FormCreate(Sender: TObject);
begin
{Высоту combobox'а не изменишь, так что вместо combobox'а
  будем изменять высоту строки grid'а !}

  StringGrid1.DefaultRowHeight:=ComboBox1.Height; {Спрятать combobox}
  ComboBox1.Visible:=False;
  end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  //Перебросим выбранное в значение из ComboBox в grid
  StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]
  :=ComboBox1.Items[ComboBox1.ItemIndex];
  ComboBox1.Visible:=False;
  StringGrid1.SetFocus;
end;

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
  //Перебросим выбранное в значение из ComboBox в grid
  StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]
  :=ComboBox1.Items[ComboBox1.ItemIndex];
  ComboBox1.Visible:=False;
  StringGrid1.SetFocus;
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
var
  R: TRect;
begin
  if ((ACol <> 1) and (ARow = 1)) then
  begin
    {Ширина и положение ComboBox должно соответствовать ячейке StringGrid}
    R := StringGrid1.CellRect(ACol, ARow); R.Left := R.Left + StringGrid1.Left;
    R.Right := R.Right + StringGrid1.Left; R.Top := R.Top + StringGrid1.Top;
    R.Bottom := R.Bottom + StringGrid1.Top; ComboBox1.Left := R.Left + 1;
    ComboBox1.Top := R.Top + 1; ComboBox1.Width := (R.Right + 1) - R.Left;
    ComboBox1.Height := (R.Bottom + 1) - R.Top; {Покажем combobox}
    ComboBox1.Visible := True; ComboBox1.SetFocus;
  end;
  CanSelect := True;
end;


ПОМОГИТЕ ПОЖАЛУЙСТА!!! Очень нужно.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

16-05-2009 14:23 | Комментарий к предыдущим ответам
>>> Я не дал ссылку на описание метода Geo только потому, что Вы невнимательно смотрите на даты - мой ответ прозвучал в апреле 2008 года, а статья появилась только в июле того же года.

Я уже признал эту ошибку в сообщении от 31-10-2008 08:01
Не заметил, что вопрос старый... Статься была написана позже.

P.S. Прошу извинить, что сообшение от 31-10-2008 07:57 получилось в форме упрёка...

16-05-2009 12:20 | Комментарий к предыдущим ответам
2 Бел Амор:
Я не дал ссылку на описание метода Geo только потому, что Вы невнимательно смотрите на даты - мой ответ прозвучал в апреле 2008 года, а статья появилась только в июле того же года. Так что идинственный упрек - то, что я не указал, что это все-таки метод Geo. Этот упрек я признаю и обещаю исправиться. Кстати, метод различения нескольких экземпляров одного и того же класса по тегу имеется в обсуждениях указанной Вами статьи.

01-11-2008 01:36
>>> Я сделал новые компоненты и добавил их на палитру, т.к. этот способ позволяет использовать и стандартный компонент на одной форме.

Программа - ваша, и принятие решения об использовании конкретных вариантов остаётся, естественно, за вами. Но я считаю, что добавление нового компонента в палитру только для формирования конкретного списка в одной конкретной TStringGrid - не очень удачное решение. Мой вариант с тегами - тоже решение "в лоб". Наилучшим вариантом, на мой взгляд, было бы либо создание универсального компонента, позволяющего формировать списки снаружи, либо перекрытие стандартной TStringGrid с добавлением такой возможности. Мне больше нравится второй вариант. Я попробовал это продемонстрировать. Некоторые вещи можно было сделать немного поудобнее, но пример вполне рабочий и пригодный для реального использования.
TStringGrid, которым не назначены списки, ничем не отличаются от стандартных, на форме можно использовать произвольное количество TStringGrid с разными списками или без списков. 

{--------------------------------------------------------------}
{ Модуль StringGridWithPickList                                }
{                                                              }
{ Перекрывает стандартный TStringGrid                          }
{ Добавляет возможность подключения выпадающих списков,        }
{ назначаемых на ячейки по строкам или колонкам                }
{ В uses должен указываться после модуля Grids                }
{ Использован "Метод Geo":                                    }
{ http://delphikingdom.com/asp/viewitem.asp?catalogid=1367    }
{--------------------------------------------------------------}

unit StringGridWithPickList;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

type
  TPickListInfo = record
    List: TStringList;
    Row: Integer;
    Col: Integer;
  end;                                   

  TStringGrid=class(Grids.TStringGrid)
  private
    FPickLists: array of TPickListInfo;
    function GetPickList(Idx: Integer): TStringList;
    function GetPickListCol(Idx: Integer): Integer;
    function GetPickListCount: Integer;
    function GetPickListRow(Idx: Integer): Integer;
    procedure SetPickListCol(Idx: Integer; const Value: Integer);
    procedure SetPickListCount(const Value: Integer);
    procedure SetPickListRow(Idx: Integer; const Value: Integer);
  protected
    function CreateEditor:TInplaceEdit; override;
    function GetEditStyle(ACol,ARow:longint):TEditStyle ;override;
  public
    destructor Destroy; override;
    property PickListCount: Integer read GetPickListCount write SetPickListCount;
    property PickList[Idx: Integer]: TStringList read GetPickList;
    property PickListCol[Idx: Integer]: Integer read GetPickListCol write SetPickListCol;
    property PickListRow[Idx: Integer]: Integer read GetPickListRow write SetPickListRow;
  end;

implementation

{Деструктор}

destructor TStringGrid.Destroy;
begin
  PickListCount := 0;
  inherited;
end;

{Перекрытые}

function TStringGrid.CreateEditor: TInplaceEdit;
begin
  Result:=TInplaceEditList.Create(Self);
end;     

function TStringGrid.GetEditStyle(ACol, ARow: Integer): TEditStyle;
var
  i: Integer;
begin
  Result := esSimple;
  for i:=Low(FPickLists) to High(FPickLists) do
    if (ACol = FPickLists[i].Col) or (ARow = FPickLists[i].Row) then
    begin
      Result := esPickList;
      (InplaceEditor as TInplaceEditList).PickList.Items.Assign(FPickLists[i].List);
      Exit;
    end;
end;

{Свойства}

function TStringGrid.GetPickList(Idx: Integer): TStringList;
begin
  Result := FPickLists[Idx].List;
end;

function TStringGrid.GetPickListCol(Idx: Integer): Integer;
begin
  Result := FPickLists[Idx].Col;
end;

function TStringGrid.GetPickListCount: Integer;
begin
  Result := Length(FPickLists);
end;

function TStringGrid.GetPickListRow(Idx: Integer): Integer;
begin
  Result := FPickLists[Idx].Row;
end;

procedure TStringGrid.SetPickListCol(Idx: Integer; const Value: Integer);
begin
  FPickLists[Idx].Col := Value;
  FPickLists[Idx].Row := -1;
end;

procedure TStringGrid.SetPickListCount(const Value: Integer);
var
  i, OldValue: Integer;
begin
  OldValue := PickListCount;
  {Увеличение}
  if OldValue < Value then
  begin
    SetLength(FPickLists, Value);
    for i := OldValue to Value-1 do  // Индексы с 0
      with FPickLists[i] do
      begin
        List := TStringList.Create;
        Row := -1;
        Col := -1;
      end;
  end;
  {Уменьшение}
  if OldValue > Value then
  begin
    for i := OldValue-1 downto Value do  // Индексы с 0
      FPickLists[i].List.Free;
    SetLength(FPickLists, Value);
  end;
end;

procedure TStringGrid.SetPickListRow(Idx: Integer; const Value: Integer);
begin
  FPickLists[Idx].Row := Value;
  FPickLists[Idx].Col := -1;
end;

end.

unit TestFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StringGridWithPickList {после Grids};

type
  TTestForm = class(TForm)
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  TestForm: TTestForm;

implementation

{$R *.dfm}

procedure TTestForm.FormCreate(Sender: TObject);
begin
  {Options устанавливать в инспекторе, здесь - для напоминания}
  StringGrid1.Options := StringGrid1.Options + [goEditing];
  StringGrid2.Options := StringGrid2.Options + [goEditing];

  {Списки по колонкам}
  with StringGrid1 do
  begin
    PickListCount := 2; // Будет 2 списка
    {Колонка 1}
    PickListCol[0] := 1;
    PickList[0].DelimitedText := 'Иванов,Петров,Сидоров';
    {Колонка 2}
    PickListCol[1] := 2;
    PickList[1].CommaText := '"Директор","Водитель","Машинист башенного крана"';
  end;

  {Списки по строкам}
  with StringGrid2 do
  begin
    PickListCount := 3; // Будет 3 списка
    {Строка 1}
    PickListRow[0] := 1;
    PickList[0].Delimiter := '|';
    PickList[0].QuoteChar := '*';
    PickList[0].DelimitedText := '*OOO "Рога и копыта"*|*ЧП Иванов*|*Магазин "Детский Мир"*';
    {Строка 2}
    PickListRow[1] := 2;
    PickList[1].DelimitedText := 'Сторож Уборщица Бухгалтер';
    {Строка 3}
    PickListRow[2] := 3;
    PickList[2].Add('Кран башенный');
    PickList[2].Add('Самосвал карьерный');
    PickList[2].Add('Аппарат телефонный');
  end;

  //ReportMemoryLeaksOnShutdown := True;
end;

end.


31-10-2008 10:15
To  Бел Амор Спасибо за ответ! Я сделал новые компоненты и добавил их на палитру, т.к. этот способ позволяет использовать и стандартный компонент на одной форме.

31-10-2008 08:24
>>> Подменяет "стандартные" функции TStringGrid и работать это будет только в Unit1.

Вы можете сделать несколько модулей с подменой TStringGrid и в разных модулях подключать нужный через uses

Но мне нужно получается сделать 2 потомка TStringGrid и в каждом отдельном подменить эти функции на новые, которые будут выставлять списки в каждом по-разному...

Если вам нужно в одном модуле сделать подмену для двух TStringGrid с разными списками, то в методе GetEditStyle класса TStringGrid вам нужно будет уметь различать экземпляры этого класса и для каждого формировать нужный список. Для того, чтобы экземпляры можно было различить, можно, например, использовать свойство Tag. Назначьте одному экземпляру, например, Tag=1, а дргому Tag=2 и проверяйте Tag в GetEditStyle

31-10-2008 08:01 | Комментарий к предыдущим ответам
>>> 2. Он не дал ссылку на его описание:

Не заметил, что вопрос старый... Статься была написана позже. Но методика неоднократно обсуждалась...

31-10-2008 07:57
>>> Как можно сделать этих потомков визуальными? где это можно прочесть?

1. Не потомков, а потомка. Нужен один класс.
1. Он уже "визуальный". Вы не уловили, что подменяется один класс, и имя этого класса совпадает с исходным.

Python не сделал главного:

1. Он не сказал, что этот "финт ушами" называется "Метод Geo"...
2. Он не дал ссылку на его описание:
http://delphikingdom.com/asp/viewitem.asp?catalogid=1367
(читайте также и обсуждение)

Рекомендую вынести доработанный класс в отдельный модуль и подключать в нужных местах через uses, иначе подменяться будут и все TStringGrid в модулях, использующих ваш модуль. Читайте статью.

31-10-2008 06:05
To Python
Здравствуйте!
Долго искал ответ на вопрос который задал Юрий и нашел самый лучший здесь :)
Я пока совсем начинающий программист... и стоит такая задача. надо на форме сделать 2 TStringGrid со списками, причем позиции колонок со списками будут у этих TStringGrid -ов будут отличатся в первом это нужно сделать 0 строчку со списками, в во втором TStringGrid 2 колонку.
Как я понял вот эта часть кода:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

Type TStringGrid=class(Grids.TStringGrid)
      protected
      function CreateEditor:TInplaceEdit;override;
      function GetEditStyle(ACol,ARow:longint):TEditStyle;override;
    end;


Подменяет "стандартные" функции TStringGrid и работать это будет только в Unit1.
Но мне нужно получается сделать 2 потомка TStringGrid и в каждом отдельном подменить эти функции на новые, которые будут выставлять списки в каждом по-разному...

Type TMyGrid1=class(Grids.TStringGrid)
      protected
      function CreateEditor:TInplaceEdit;override;
      function GetEditStyle(ACol,ARow:longint):TEditStyle;override;

Type TMyGrid2=class(Grids.TStringGrid)
      protected
      function CreateEditor:TInplaceEdit;override;
      function GetEditStyle(ACol,ARow:longint):TEditStyle;override;
    end;
    end;


Но беда в том, что пооложить эти TMyGrid1 и TMyGrid2 на форму нельзя (точнее я не знаю как это делать). Даже залез в dfm файл и совершил некоторые подуги... но испортил форму напроч :)
Как можно сделать этих потомков визуальными? где это можно прочесть?
Или может я черезчур замарачиваюсь?? и есть други пути решения этой маленькой, но для меня проблемы?
Спасибо!

06-05-2008 12:22 | Сообщение от автора вопроса
Спасибо все получилось так как я и хотел!!!

21-04-2008 11:43 | Вопрос к автору: запрос дополнительной информации
>>> Если Combobox не скрытый
Э-э-э, а вы мой пост видели?

19-04-2008 03:15 | Сообщение от автора вопроса
Если Combobox не скрытый то тоже ничего не получается!

18-04-2008 14:44
Чего-то я не понимаю, зачем какой-то TComboBox привинчивать, если все уже привинчено. Как снаружи управлять - честно говоря, не знаю, но вот я слету написал такой простой пример, где можно выбирать значения и редактировать поля как душеньке угодно. На форме лежит TStringGrid, Align=alClient, Options=[goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goEditing, goAlwaysShowEditor] все остальное - по умолчанию, код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

Type TStringGrid=class(Grids.TStringGrid)
      protected
      function CreateEditor:TInplaceEdit;override;
      function GetEditStyle(ACol,ARow:longint):TEditStyle;override;
    end;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TStringGrid }

{ TStringGrid }

function TStringGrid.CreateEditor: TInplaceEdit;
begin
  Result:=TInplaceEditList.Create(Self);
  with TInplaceEditList(Result) do begin
    Parent:=Self.Parent;
  end;
end;

function TStringGrid.GetEditStyle(ACol,ARow:longint):TEditStyle;
begin
  case ACol of
    1:begin
      Result:=esPickList;
      with TInplaceEditList(InplaceEditor) do begin
        PickList.Clear;
        PickList.AddItem('Column 1_1',nil);
        PickList.AddItem('Column 1_2',nil);
        PickList.AddItem('Column 1_3',nil);
        PickList.AddItem('Column 1_4',nil);
      end;
    end;
    2:begin
      Result:=esPickList;
      with TInplaceEditList(InplaceEditor) do begin
        PickList.Clear;
        PickList.AddItem('Column 2_1',nil);
        PickList.AddItem('Column 2_2',nil);
        PickList.AddItem('Column 2_3',nil);
        PickList.AddItem('Column 2_4',nil);
      end;
    end else Result:=esSimple;
  end;
end;

end.


18-04-2008 12:33
Вам указал на ошибку Александр Алексеев
Зачем Вам эта процедура:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  //Перебросим выбранное в значение из ComboBox в grid
  StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]
  :=ComboBox1.Items[ComboBox1.ItemIndex];
  ComboBox1.Visible:=False;
  StringGrid1.SetFocus;
end;


При вводе любого символа в появившейся ComboBox получаете
скрытие (ComboBox1.Visible:=False) ComboBox'а.


18-04-2008 12:17 | Сообщение от автора вопроса
Там тоже ничего нет!

08-04-2008 05:25 | Сообщение от автора вопроса
Спасибо! Посмотрю.

07-04-2008 18:03
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=61019

07-04-2008 17:54 | Комментарий к предыдущим ответам
Этот вопрос сегодня задавала сама Таньчик.
Только тогда она звалась Татьяной.
Теперь она подросла и сама отвечает.

07-04-2008 11:41 | Сообщение от автора вопроса
Что-то все равно список не выпадает.:(!!!

20-03-2008 10:23 | Сообщение от автора вопроса
Спасибо! Обьязательно проверю.

20-03-2008 07:11
Когда вы вводите что-то в ComboBox, у вас возникает OnChange. Что вы делаете в своём OnChange? Правильно, скрываете ComboBox.
И чего-же вы после этого ждали?

20-03-2008 04:58 | Сообщение от автора вопроса
Ты хочеш сказать что содержимое Items в combobox забить в базу? Мне нужно чтобы випадал список при переходе в ячейку. Потом вынуть числа,(это будет масив), для работы с ними (мат. операциями). А GridPanel я что-то тоже не нашел.

19-03-2008 17:10
А можешь сформулировать задачу, для каких целей понадобилось так мучаться? У меня была похожая задачка, но только с использованием базы данных, поэтому для моих целей подошел компонент DBGrid. Может тебе тоже он сможет помочь? Сейчас залезла в книжку по дельфи, там рассказывается про один интересный компонент GridPanel с вкладки Additional. Возможно тебе стоит поискать в этом направлении. Только я его у себя не нашла так сразу (у меня delphi7), не хватило немного времени разобраться. Может тебе это удастся.

19-03-2008 10:36 | Сообщение от автора вопроса
Я хочу чтоби в Stringgrid - е был выпадающий список по-этому и ввожу туда Combobox. Делаю его невидимым чтобы он открывался тогда когда переходиш в ячейку где и есть Combobox. Сначала он начинает вылетать (по нажатию первой клавиши)(мышкой тоже можна выбрать), но потом - нажимая следующую клавишу начинает показывать в ячейке именно ее.
Пошагово пробывали пройтись по коду? Нет. Мне стыдно. я еще на слабом уровне и не понимаю принцыпа..

19-03-2008 10:13 | Вопрос к автору: запрос дополнительной информации
Не понятно, что значит "заганяю Combobox в StirngGrid"? И для каких целей? Может я не поняла вопроса, но судя по коду Combobox является невидимым, соответственно программа просто не заходит в его события. Пошагово пробывали пройтись по коду? Насколько я могла понять, то изменение всеже происходит в StrinGrid, а не в Combobox, соответственно происходит событие StrinGrid-а.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
"Мы с тобой одной крови — ты и я!". Чьи это заветные слова?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

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

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования