Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 57
1
Delphi 6-7

Передача в процедуру любого визуального объекта через одну переменную

06.02.2019, 02:05. Показов 5394. Ответов 84

Author24 — интернет-сервис помощи студентам
Написал небольшую прогу и заморочился с полным ресайзом всех объектв и шрифтов на форме при резайзе самой формы. Написал, работает, но процедура ресайза просто ГИГАНСКАЯ и не умещается в экран и постоянно в ней одно и тоже, типа этого:
Delphi
1
2
3
4
5
6
7
8
9
10
  ButSel.Width:=Round(Panel1.Left*0.8);
  ButSel.Height:=ButSel.Width div 2;
  ButSel.Left:=Round(Panel1.Left*0.1);
  ButSel.Top:=Panel1.Top;
  ButSel.Font.Size:=Round(ButSel.Width/16);
  Ed1.Width:=ButSel.Left*2;
  Ed1.Height:=ButSel.Left*2;
  Ed1.Left:=Panel1.Left Div 2 - Ed1.Width div 2;
  Ed1.Top:=ButSel.Top+ButSel.Height*2;
  Ed1.Font.Size:=Round(Ed1.Width*0.55);
Этот пример конечно не особо наглядный, тут я то к одному, то к другому привязываюсь, но не суть.
Попытался написать доп. процедуру чтобы было типа:
Delphi
1
2
3
  ResizeF(ButSel,0.3,0.14,0.65,0.65,0);
  ResizeF(Ed1,0.3,0.14,0.65,0.65,0);
  ResizeF(Panel1,0.3,0.14,0.65,0.65,0);
Всё было бы хорошо, но вот все объекты разных типов и универсальная процедура для 10 типов разных объектов затянет строк на 70, выглядит оно вот так тупо:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure ResizeF(Me: TObject; L,U,X,Y,FS:real);
begin
   If (Me is TLabel) then begin
    (Me as TLabel).Left:=Round(Form1.Width * L);
    (Me as TLabel).Top:=Round(Form1.Height * U);
    (Me as TLabel).Width:=Round(Form1.Width * X);
    (Me as TLabel).Height:=Round(Form1.Height * Y);
    If FS>0 Then (Me as TLabel).Font.Size:=Round((Me as TLabel).Width * FS);
   end;
   If (Me is TPanel) then begin
    (Me as TPanel).Left:=Round(Form1.Width * L);
    (Me as TPanel).Top:=Round(Form1.Height * U);
    (Me as TPanel).Width:=Round(Form1.Width * X);
    (Me as TPanel).Height:=Round(Form1.Height * Y);
    If FS>0 Then (Me as TPanel).Font.Size:=Round((Me as TPanel).Width * FS);
  end;
// и так далее до бесконечности разнообразия типов........
Каким типом обозвать переменную "Me" чтобы она была "съедобна" для компилятора с любым визуальным типом.
Чтобы в процедуру и "кнопку" и "панель" и "метку" передать можно было и не расписывать по 7 строк для каждого предполагаемого типа.
Заранее ГРОМАДНОЕ СПАСИБО!

P.S. Если у кого есть и другие мысли, методы, способы по полному ресайзу всех объектов на форме при ресайзе самой формы, очень буду признателен за инфу, почитаю, изучу обязательно. Даже если они вообще с другим подходом. Чтоб форма как картинка больше-меньше, а всё на месте осталось и с нужными пропорциями. Спасибо, спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2019, 02:05
Ответы с готовыми решениями:

Передача любого объекта в метод
Добрый день. Подскажите, пожалуйста. Есть метод: при изменении состояния checkBox'а изменяется...

Передача любого объекта в виде параметра функции в отдельный класс
Доброго времени суток, подскажите пожалуйста, у меня есть несколько панелей, на которых нужно...

Передача объекта в процедуру
Привет всем. Есть такая проблема: не могу передать объект в процедуру в Excel VBA. Есть собственный...

Передача в процедуру одну стрчоку из двумерного массива
Я знаю, как передать строчку из двумерного массива в си. Нужно передать в функцию вот так: *(Ar+i),...

84
пофигист широкого профиля
4739 / 3172 / 860
Регистрация: 15.07.2013
Сообщений: 18,281
06.02.2019, 03:14 2
Цитата Сообщение от klass2323 Посмотреть сообщение
Каким типом обозвать переменную "Me" чтобы она была "съедобна" для компилятора с любым визуальным типом.
TControl.
1
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 57
06.02.2019, 04:03  [ТС] 3
northener, Гениально! "Краткость сестра таланта"! Спасибище!
Извиняюсь за наглость, но можно так же чтоб и размер шрифта так же красиво прокатил?
Шрифт не пролазит... :-(
Но всё равно уже гораздо-гораздо лаконичней получается!
Delphi
1
2
3
4
5
6
7
8
procedure ResizeF(Me: TControl; L,U,X,Y,FS:real);
begin
  Me.Left:=Round(Form1.Width * L);
  Me.Top:=Round(Form1.Height * U);
  Me.Width:=Round(Form1.Width * X);
  Me.Height:=Round(Form1.Height * Y);
  If FS>0 Then Me.Font.Size:=Round(Me.Width * FS); // На эту строку ругается
end;
[Ошибка] Unit1.pas(170): Undeclared identifier: 'Font'
Я конечно подозреваю что фиг, но надежда...
0
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
06.02.2019, 04:27 4
Цитата Сообщение от klass2323 Посмотреть сообщение
Чтоб форма как картинка больше-меньше, а всё на месте осталось и с нужными пропорциями
Свойства Align, Anchor, AlignWithMargins и Margins

Обучашка по оформлению
1
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 57
06.02.2019, 05:34  [ТС] 5
Nanotentacle, Спасибо! Очень интересная статья. И та что в ней в конце указана тоже.
Изучил, впитал, прочувствовал.
И сразу засада...
В семёрке вместо AlignWithMargins, Margins и Padding "писюлька" такая,.. громадная... :-(

Блин, я вот даже разочарован, неужели в Делфи нет такого как в HTML чтоб в процентах ширину и отступы указал, всё, без всяких постоянных пересчётов - автоматом.
У меня автоформат формы в несколько раз больше кода чем сама прога, это ж блин... слов нет.
А на счёт Margins и т. д. в конкретном данном случае не подходит, надо чтобы и отступы от краёв тоже менялись, абсолютно всё менялось. Как резиновая, вместе с шрифтами тоже.
Например Ширина формы 1000 пикселей, отступ левый 10, Ширина кнопки 50, вот чтоб при ширине формы 100 стало - отступ 1, ширина кнопки 5. Ну я так, образно, до 100 пикселей там конечно тянуть никто не даст, просто для примера.

Ну мне осталось размер шрифта как-то протащить "контрабандно" в процедуру, любыми путями и цель достигнута.
Я уже думал может тупо стрингом название объекта в процедуру протащить, а потом типа по факту FindComponent и поехали, так хренушки, все равно тип требует, падлюка. Не прокатило... Мышку скоро покусаю! :-)
0
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
06.02.2019, 05:42 6
Лучший ответ Сообщение было отмечено klass2323 как решение

Решение

Цитата Сообщение от klass2323 Посмотреть сообщение
Ну мне осталось размер шрифта как-то протащить "контрабандно"
Ну общий предок у TLabel и TPanel один - это TControl. Соответственно, с этим будет сложно. Но есть одна хитрость. Можно в процедуру передавать не только ссылку на сам компонент, но и ссылку на TFont, например (а если его нет, то просто Nil). А внутри процедуры проверять:

Delphi
1
2
3
4
5
6
7
8
9
procedure ResizeF(Me: TControl; AFont:TFont; L,U,X,Y,FS:real);
begin
  Me.Left:=Round(Form1.Width * L);
  Me.Top:=Round(Form1.Height * U);
  Me.Width:=Round(Form1.Width * X);
  Me.Height:=Round(Form1.Height * Y);
If assigned(AFont) then
  If FS>0 Then AFont.Size:=Round(Me.Width * FS); // На эту строку ругается
end;
Можно даже ее как overload ввести, чтоб было более-менее красиво. Скорее всего, сработает.
0
Модератор
9299 / 6076 / 2383
Регистрация: 21.01.2014
Сообщений: 25,926
Записей в блоге: 3
06.02.2019, 05:59 7
Лучший ответ Сообщение было отмечено klass2323 как решение

Решение

Цитата Сообщение от klass2323 Посмотреть сообщение
Шрифт не пролазит... :-(
Можно, конечно, вот так "обмануть"...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Перед объявлением класса формы объявим свой класс - наследник TControl
type
//Это наш класс
  TMyCtrls = class(TControl)
  public
    property Font;
  end;
//А это пошел класс формы
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
//Далее все как есть
    .... 
//Чуть изменим параметры Вашей процедуры
procedure ResizeF(Me: TMyCtrls; L, U, X, Y, FS: double);
begin
  ...
//Тут меняем остальные свойства, а потом шрифт:
 if FS > 0 then Me.Font.Size := Round(Me.Width * FS);
end;
//Пример вызова процедуры
ResizeF(TMyCtrls(Panel1), 0.3, 0.14, 0.65, 0.65, 0);
но, как по мне, правильнее со свойствами поиграться, на которые Nanotentacle указал...
0
Заблокирован
06.02.2019, 08:38 8
Цитата Сообщение от klass2323 Посмотреть сообщение
неужели в Делфи нет такого как в HTML чтоб в процентах ширину и отступы указал, всё, без всяких постоянных пересчётов - автоматом.
Конечно есть. Именно такой компонент. С процентами ширины и высоты.

Передача в процедуру любого визуального объекта через одну переменную
0
5790 / 4531 / 1432
Регистрация: 14.04.2014
Сообщений: 20,168
Записей в блоге: 20
06.02.2019, 09:42 9
ну и от нелегальной D7 давно пора уйти на легальную D CE
0
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 57
06.02.2019, 09:56  [ТС] 10
Nanotentacle, Слушайте, а ничего так способ, слегка "черезжопно" наверно выглядит, ну да и хрен с ним! :-)
Главная ведь цель достигнута, избавиться от последней лишней строчки!
Думаю наверно так и сделаю. На читабельность проги это никак не влияет!
Спасибо!!!
Про оверлоад я нихрена к сожалению не знаю, только что прочитал, примеры посмотрел, но нифига пока не въехал. Но я спал очень давно, может посплю, въеду...
Спасибо за все подсказки!
0
884 / 404 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
06.02.2019, 10:06 11
Цитата Сообщение от klass2323 Посмотреть сообщение
Про оверлоад я нихрена к сожалению не знаю, только что прочитал, примеры посмотрел, но нифига пока не въехал. Но я спал очень давно, может посплю, въеду...
Все просто. Overload позволяет создавать процедуры/функции (причем, могут быть и процедуры с функциями вместе) с одинаковым названием но разным набором параметров. В результате, в вашем случае можно было сделать еще одну процедуру с таким же названием, добавив в параметры AFont, и исправить вызов процедур только там, где компонент имеет текстовое поле. А компилятор сам разберется какие процедуры ему вызывать исходя из набора параметров.
0
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 57
06.02.2019, 10:10  [ТС] 12
D1973, Поразительно! Ваше "заклинание" работает! Я правда не особо понял как оно работает, но работает. Я проверил! Портал прям какой-то. Мне кажется до меня эти классы доходить начали частично. Правда "проперти" всякие и "паблик" "не паблик" - ХЗ куда его тулить.
Я конечно всё больше понимаю, что я нифига не понимаю из того, что должен. Ну потому я и здесь...
Спасибо Вам БОЛЬШОЕ, за такой интересный способ, прям не знаю как к нему и относиться. Прикольно, но пока не понимаю, а хотелось бы...
0
5292 / 4326 / 1061
Регистрация: 29.08.2013
Сообщений: 27,150
Записей в блоге: 3
06.02.2019, 10:17 13
мне кажется что главу про ООП в учебнике вы будете читать как детектив в котором вы уже знаете кто убийца

Цитата Сообщение от klass2323 Посмотреть сообщение
Мне кажется до меня эти классы доходить начали частично
и это радует)
0
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 57
06.02.2019, 10:27  [ТС] 14
Verevkin, Грешно смеяться над убогими! А если серьёзно: Что это за среда такая? У меня наверно только половина из всего что у Вас есть! И вот этого "TGridPanel" точно нету...
Нельзя его как нибудь скачать отдельно?
За подсказку спасибо!
0
Заблокирован
06.02.2019, 10:32 15
Цитата Сообщение от klass2323 Посмотреть сообщение
Грешно смеяться над убогими!
Не понял.
Цитата Сообщение от klass2323 Посмотреть сообщение
А если серьёзно: Что это за среда такая?
Это Delphi. Не самая свежая версия, правда. А чо не так?
Цитата Сообщение от klass2323 Посмотреть сообщение
У меня наверно только половина из всего что у Вас есть! И вот этого "TGridPanel" точно нету...
Ойойой, а почему? Неужели никак не вылечишься от синдрома delphi7? Мож хватит уже трупы пинать в 2019 году?
0
Модератор
9299 / 6076 / 2383
Регистрация: 21.01.2014
Сообщений: 25,926
Записей в блоге: 3
06.02.2019, 10:36 16
Цитата Сообщение от klass2323 Посмотреть сообщение
Я правда не особо понял как оно работает
Да просто... У класса TControl свойство Font на самом-то деле есть, просто запрятано оно от посторонних глаз в секции protected. Вот и вытащили мы его наружу, унаследовавшись от этого самого TControl и поместив это свойство в секцию public.
Наследники - они такие: все, что предок в кубышку складывал - они сразу разбазарить готовы...
0
5292 / 4326 / 1061
Регистрация: 29.08.2013
Сообщений: 27,150
Записей в блоге: 3
06.02.2019, 10:48 17
Цитата Сообщение от klass2323 Посмотреть сообщение
Нельзя его как нибудь скачать отдельно?
на сайте Embarcadero бесплатно (БЕСПЛАТНО) раздают самую последнюю версию делфи Embarcadero Delphi XE10.3 сроком на 1 год
0
Заблокирован
06.02.2019, 10:50 18
Цитата Сообщение от qwertehok Посмотреть сообщение
на сайте Embarcadero бесплатно (БЕСПЛАТНО) раздают самую последнюю версию делфи Embarcadero Delphi XE10.3 сроком на 1 год
Без СМС и регистрации, я надеюсь?
0
Модератор
9299 / 6076 / 2383
Регистрация: 21.01.2014
Сообщений: 25,926
Записей в блоге: 3
06.02.2019, 10:56 19
Без СМС, но с регистрацией... И после года лицензию, как я понял, можно продлить...
0
Заблокирован
06.02.2019, 11:00 20
Цитата Сообщение от D1973 Посмотреть сообщение
Без СМС, но с регистрацией... И после года лицензию, как я понял, можно продлить...
И чего? Оно совсем не отличается от Architect, штоли?
0
06.02.2019, 11:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2019, 11:00
Помогаю со студенческими работами здесь

Выразить одну переменную через другую
помогите выразить x через Е, пытаюсь через solve вот что выдает.

Вывод ряда фибоначчи через одну переменную
Добрый вечер! Нужно реализовать программу, которая вычисляет ряд Фибоначчи и выводит этот ряд в...

Доступ к свойству объекта через переменную
#include <iostream> class Student { public: char* fname; char* sname; Student(char*...

Вызов объекта через строковую переменную
Excel. Есть книга с главным листом и множеством второстепенных. Задача: создать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru