Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2010, 06:08   #1
Elvisnya
Пользователь
 
Аватар для Elvisnya
 
Регистрация: 13.09.2008
Сообщений: 24
Вопрос Конструктор пластиковых окон

Здравствуйте! Хочу написать "конструктор" пластиковых окон, но даже не знаю с чего начать. Конструктор окон должен выглядеть примерно ТАК. Посоветуйте какие компоненты лучше использовать для такой задачи, и в общих чертах как это реализовывать. Заранее спасибо

P.S. Хотел использовать TShape, но не знаю как сделать:
  1. выделение при щелчке (Чтобы указывать программе куда ставить створку или например импост)
  2. динамическое создание новых фигур TShape (например добавляю в процессе работы программы новую форточку или например новый импост)
Elvisnya вне форума Ответить с цитированием
Старый 25.03.2010, 06:50   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
динамическое создание новых фигур TShape (например добавляю в процессе работы программы новую форточку или например новый импост)
Создайте структуру:
Код:
type
    Okno = record
        Elem: Array of TShape;   // Элементы окна
        Count: Integer;             // Число элементов
    end;
И не забывайте об инициализации Elem

Добавление нового элемента в конец
Код:
Inc(Count);
SetLength(Elem, Count);
Удаление последнего элемента
Код:
Dec(Count);
SetLength(Elem, Count);
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 25.03.2010 в 07:52.
Utkin вне форума Ответить с цитированием
Старый 25.03.2010, 08:33   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
"конструктор" пластиковых окон
Моделирование окон?
Так для этого CAD системы обычно применяются. Делфи тут не помошник.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.03.2010, 08:34   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Наверно хочет специализированную прогу, сразу с калькулятором стоимости и т.д.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 25.03.2010, 14:02   #5
Elvisnya
Пользователь
 
Аватар для Elvisnya
 
Регистрация: 13.09.2008
Сообщений: 24
По умолчанию

Utkin Спасибо. Сейчас почитаю про динамические массивы и записи, потом попробую сделать то что вы написали и отпишусь.
P.S. Да. Хочу написать прогу с калькуляцией стоимости и т.д.
Elvisnya вне форума Ответить с цитированием
Старый 25.03.2010, 14:22   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А-а-а так это рассчетная прога?
Дык калькуляцию лучше делать используя базы данных.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.03.2010, 16:20   #7
Elvisnya
Пользователь
 
Аватар для Elvisnya
 
Регистрация: 13.09.2008
Сообщений: 24
Радость

Разобрался...кажется. Но есть несколько вопросов:

1. Если на форме не будет хотя бы одного компонента Shape, то
Код:
RecOkno=record
   Elem:array of TShape;
   Count:Integer;
end;
2. Под инициализацией вы понимали примерно следующее:
Код:
  //Увеличиваю Count на 1
  Inc(Okno.Count);

  //Увеличиваю длину динамического массива на один элемент
  SetLength(Okno.Elem, Okno.Count);

  //Создаю объект типа TShape и записываю указатель на него в Elem[1]
  Okno.Elem[Okno.Count]:=TShape.Create(Self);

  //От болды назначаю ширину и высоту
  Okno.Elem[Okno.Count].Width:=100;
  Okno.Elem[Okno.Count].Height:=100;

  //ПОСЛЕ ЭТОЙ КОМАНДЫ ФИГУРА ПОЯВИЛАСЬ НА ФОРМЕ. ЧТО Я СДЕЛАЛ?
  Okno.Elem[Okno.Count].Parent:=Form1;
3. Как сделать выделение при щелчке (Чтобы указывать программе куда ставить створку или например импост)
Elvisnya вне форума Ответить с цитированием
Старый 25.03.2010, 16:47   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну вообще-то TShape для этогоне очень подходит.
Впрочим назнач им всем один и тот же обработчик OnMouseDown

Okno.Elem[Okno.Count].OnMouseDown:=Shape1MouseDown;
Где
procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Описанная в составе класса TForm1

А в ней TShape(Sender) даст тебе обьект по которому кликнули.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.03.2010, 07:43   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Если на форме не будет хотя бы одного компонента Shape, то
То ничего страшного не произойдет.
Цитата:
2. Под инициализацией вы понимали примерно следующее:
Что-то вроде этого.
Цитата:
ПОСЛЕ ЭТОЙ КОМАНДЫ ФИГУРА ПОЯВИЛАСЬ НА ФОРМЕ. ЧТО Я СДЕЛАЛ?
Okno.Elem[Okno.Count].Parent:=Form1;
Вы все сделали правильно - установили родителя фигуры. Это информация для фигуры - где и как ей отображаться. Зная родителя, фигура получает привязку к координатам и еще кучу дополнительной информации без которой нарисоваться она не сможет.

Цитата:
3. Как сделать выделение при щелчке (Чтобы указывать программе куда ставить створку или например импост)
Стилет уже ответил - отлавливаете координаты мыши в момент щелчка, запоминаете их. Изменяете свойства конкретного TShape, так чтобы его отображение отличалось от остальных (например чуть увеличивать в размерах). Вообще посмотрите все свойства TShape.

ЗЫ. Есть такая штука, называется DRKB (введите в гугле или в Яндексе) - в ней содержатся много разных примеров кода для Дельфи. Посмотрите, многие моменты прояснит.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.03.2010, 00:00   #10
Elvisnya
Пользователь
 
Аватар для Elvisnya
 
Регистрация: 13.09.2008
Сообщений: 24
Сообщение

Stilet спасибо, сделал как вы сказали. Получилось...почти. Возникла проблема, почему на Shape2, чтобы он окрасился в красный цвет, нужно нажимать два раза, а не один раз и как это исправить?

Код:
procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  (Sender as TShape).Brush.Color:=clRed;
end;

procedure TForm1.Shape2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Shape2.OnMouseDown:=Shape1MouseDown;
end;
Utkin
Цитата:
То ничего страшного не произойдет.
Затупил. Код ниже работает, хотя на форме нет ни одного Shape'a
Код:
procedure AddElem(Okno:RecOkno);
begin
  inc(Okno.Count);
  SetLength(Okno.Elem,Okno.Count);
  Okno.Elem[Okno.Count]:=TShape.Create(Form1);
  Okno.Elem[Okno.Count].Parent:=Form1;
end;

procedure TForm1.AddButtonClick(Sender: TObject);
begin
  AddElem(Okno)
end;
P.S. DRKB скачал. Толком ещё не смотрел, но "вешь" хорошая.
Elvisnya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
конструктор An123 Помощь студентам 1 17.01.2010 17:14
Конструктор 3D игр Наблюдатель Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 13.02.2009 18:13
Конструктор PilGrim Общие вопросы C/C++ 0 16.01.2009 10:21