Есть форма которая в одном столбике компонета stringgrid выводит названия городов, нужно из этих названий сделать ссылки которые открывают другую форму с информацией про соотвественный город. Как сделать из названий ссылки? За вывод информации про каждый город отвечает одна стандартная форма, которая читает данные из файлов.
мисс_граффити
18.01.2011 14:54
может быть, обрабатывать OnMouseDown? определять, по какому городу щелкнули...
volvo
18.01.2011 15:38
Цитата
Есть форма которая в одном столбике компонета stringgrid выводит названия городов
Вместо текста с названием города пускай она создает TLabel с нужной информацией (и со своим обработчиком OnClick), и вставляет его в грид. Тогда при клике на любой из этих Label-ов будет выполняться нужный обработчик без каких-либо дополнительных действий с твоей стороны. Как вставить один компонент в другой - см. DRKB.
Yurka
18.01.2011 16:05
Цитата(volvo @ 18.01.2011 12:38)
Вместо текста с названием города пускай она создает TLabel с нужной информацией (и со своим обработчиком OnClick), и вставляет его в грид. Тогда при клике на любой из этих Label-ов будет выполняться нужный обработчик без каких-либо дополнительных действий с твоей стороны. Как вставить один компонент в другой - см. DRKB.
Спасибо! Будем пробовать
Yurka
18.01.2011 17:19
Цитата(volvo @ 18.01.2011 12:38)
Вместо текста с названием города пускай она создает TLabel с нужной информацией (и со своим обработчиком OnClick), и вставляет его в грид. Тогда при клике на любой из этих Label-ов будет выполняться нужный обработчик без каких-либо дополнительных действий с твоей стороны. Как вставить один компонент в другой - см. DRKB.
Хмм... Не так всё просто как казалось. Может есть какой-нибудь другой подход?
volvo
18.01.2011 17:21
Поправка: вместо TLabel использовать TStaticText, потому как TLabel - не оконный компонент, и будет лежать под оконными компонентами, его на гриде просто не будет видно. А Статик - это компонент оконный, он прекрасно будет отображаться...
Цитата
Хмм... Не так всё просто как казалось.
Куда ж проще? Что, код показать?
Yurka
18.01.2011 17:40
Цитата(volvo @ 18.01.2011 14:21)
Поправка: вместо TLabel использовать TStaticText, потому как TLabel - не оконный компонент, и будет лежать под оконными компонентами, его на гриде просто не будет видно. А Статик - это компонент оконный, он прекрасно будет отображаться...
Куда ж проще? Что, код показать?
у меня идея такая возникла: создаю простую процедуру которая просто открывает нужную форму, например:
Код
procedure TForm1.Click(Sender: TObject); begin form2.Show; end;
для собития onClick в stringgrid, то есть где бы не кликнул по ячейке нужная форма откроется, но тут возникают проблемы, как узнать номер ячейки по которой кликнули и как сделать активным для кликов только нужный столбец
volvo
18.01.2011 18:18
Цитата
как узнать номер ячейки по которой кликнули
В OnClick - никак. Надо ловить OnMouseDown, там определять, в какой ячейке пользователь нажал на кнопку мыши, запоминать координаты ячейки, а потом - ловить OnClick и обрабатывать запомненное раньше значение. Предупреждаю сразу: это - плохой метод. Ибо в Windows я привык, что если нажму мышой на контрол, а потом передумаю и нажатую мышь уведу с контрола - то клик не засчитывается. У тебя будет засчитываться. Это нехорошо. Чем тебе вот это решение не понравилось - понять не могу.
procedure TForm1.StaticText_Click(Sender: TObject); begin // Здесь вместо вывода сообщения будешь выводить форму с информацией // о городе, название которого хранится в Caption ShowMessage( 'City : ' + (Sender as TStaticText).Caption ); end;
// добавляем название города, хранящееся в Эдите City_Name в строку // грида с номером, который хранится в Эдите Row_Num. Это для теста. // Можно сразу передавать название города и индекс строки грида...
procedure TForm1.Add_CityClick(Sender: TObject); var New_SText : TStaticText; begin New_SText := TStaticText.Create(Application); with New_SText do begin Caption := City_Name.Text; Parent := StringGrid1.Parent; OnClick := StaticText_Click; end; StringGrid1.Objects[1, StrToInt(Row_Num.Text)] := New_SText;
procedure TForm1.Static_Alignment(ARow : Integer); var My_SText : TStaticText; Rect : TRect; begin My_SText := (StringGrid1.Objects[1, ARow] as TStaticText); if My_SText <> nil then begin Rect := StringGrid1.CellRect(1, ARow); My_SText.Left := StringGrid1.Left + Rect.Left + 2; My_SText.Top := StringGrid1.Top + Rect.Top + 2; My_SText.Width := Rect.Right - Rect.Left; My_SText.Height := Rect.Bottom - Rect.Top; My_SText.Alignment := taCenter; end; end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if not (gdFixed in State) then begin if ACol = 1 then begin Static_Alignment(ARow); end; end; end;
end.
Вот оно работает так, как пользователь привык. А ты извращайся дальше
Yurka
18.01.2011 20:43
Цитата(volvo @ 18.01.2011 15:18)
В OnClick - никак. Надо ловить OnMouseDown, там определять, в какой ячейке пользователь нажал на кнопку мыши, запоминать координаты ячейки, а потом - ловить OnClick и обрабатывать запомненное раньше значение. Предупреждаю сразу: это - плохой метод. Ибо в Windows я привык, что если нажму мышой на контрол, а потом передумаю и нажатую мышь уведу с контрола - то клик не засчитывается. У тебя будет засчитываться. Это нехорошо. Чем тебе вот это решение не понравилось - понять не могу.
Ваш код записал в delphi 7. Результат прикрепляю. Получается, что в StringGrid всё равно ссылки не создаются, ссылка создается вверху формы, может и напутал чего конечно...