аналог RadioButton но для Label (вопрос новичка)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
pensioner
новенький
Сообщения: 13
Зарегистрирован: 02.11.2009 20:02:28

аналог RadioButton но для Label (вопрос новичка)

Сообщение pensioner »

Можно сказать что прижало написать программку.
Прошу быть снисходительным к новичку.

В программе нужно, что бы по щелчку по Label66 подсвечивалась (меняла цвет фона) Label24, затем по щелчку по Label67 --> Label25, и так далее, всего 21 поле.

Код: Выделить всё

procedure TForm1.Label66Click(Sender: TObject);
begin
  Label24.Color:=clRed;
end;

Мне же необходимо чтобы это работало как переключатель, типа RadioButton, тоесть по щелчку по очередному Label(66-86) прежние Label(24-44) возвращались в своё исходное положение, а подсвечено было только одно поле.

Подскажите пожалуйста как это лучше реализовать.
Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Сообщение Andreich »

Не совсем понял что именно нужно,.. и еще меньше представляю где это могут использоваться переключатели из 86ти Label'ов, но если все настолько круто, то можешь попробовать воспользоваться свойством Tag + if_then_else.

Но разумнее все же будет использовать RadioGroup.
pensioner
новенький
Сообщения: 13
Зарегистрирован: 02.11.2009 20:02:28

Сообщение pensioner »

Да, я думал что можно через условие(условия), просто громоздко получиться. Думал вдруг есть способ проще)))

и еще меньше представляю где это могут использоваться переключатели из 86ти Label'ов

Насамом деле их будет намного больше.
Просто нужно чтобы интерфейс программы приближённо напоминал фэйс оригинальной программы, написаной на бейсике и работающей на windows (см. вложение, подсвечивается "v3" на графике и в таблице).
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

pensioner
Наверное лучше воспользоваться одним обработчиком на всех и в нём использовать конструкцию Case .. Of.
При этом лейблы сделать не самостоятельными элементами накиданными на форму, а элементами массива для удобства групповой обработки.

Добавлено спустя 4 минуты 33 секунды:
pensioner
Вопрос не в тему... :)
У меня тоже встала сейчас задача подобная Вашей. ;) Будет чертёж с большим количеством отрезков и эти отрезки надо подписывать названиями, всё прямо как у Вас. :) Собственно вопрос - как это сделать, чтобы названия не налезали на линии? Линии будут рисоваться под углом, зависящим от входных параметров, т.е. угол заранее неизвестен. У Вас, я вижу, это сделано просто превосходно. ;)
pensioner
новенький
Сообщения: 13
Зарегистрирован: 02.11.2009 20:02:28

Сообщение pensioner »

Нашёл таки решение)))))
через переменную TLabel

Код: Выделить всё

var
MyVarLabel: TLabel;
..............................
..............................
procedure TForm1.FormCreate(Sender: TObject);
begin
  MyVarLabel:=Label24; // обязательно нужно поместить в переменную любой Label
end; 
................................
................................
// а дальше всё просто))
procedure TForm1.Label66Click(Sender: TObject);
begin
   MyVarLabel.Color:=clNone;
   MyVarLabel:=Label24;
   MyVarLabel.Color:=clRed;
end;

procedure TForm1.Label67Click(Sender: TObject);
begin
    MyVarLabel.Color:=clNone;
    MyVarLabel:=Label25;
    MyVarLabel.Color:=clRed;
end;

procedure TForm1.Label68Click(Sender: TObject);
begin
    MyVarLabel.Color:=clNone;
    MyVarLabel:=Label26;
    MyVarLabel.Color:=clRed;
end;
...................................
...................................
// и так далее

всё переключается))
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

Достаточно написать один обработчик и привязать его ко всем лейблам через инспектор объектов.
В этом случае его код будет выглядеть так:

Код: Выделить всё

procedure TForm1.Label66Click(Sender: TObject);
begin
   MyVarLabel.Color:=clNone;
   MyVarLabel:=Sender as TLabel;
   MyVarLabel.Color:=clRed;
end;


А чтобы не мучаться щёлкая мышкой по ИО , можно сделать это через код в обработчике onCreate формы:

Код: Выделить всё

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
  MyVarLabel:=Label24; // обязательно нужно поместить в переменную любой Label
  for i := 0 to Self.ComponentCount-1  do
  if Self.Components[i] is TLabel then
  (Self.Components[i] as TLabel).OnClick:=@Label66Click;
end;
pensioner
новенький
Сообщения: 13
Зарегистрирован: 02.11.2009 20:02:28

Сообщение pensioner »

svk12
Спасибо.
Мне конечно плохо (пока) понятна часть кода, но всё равно учту.
Ответить