26 (edited by sibprogsistem 2019-06-17 09:32:22)

Re: Вопросы от неразбирающегося

Vyvern wrote:

Здравствуйте!
Возникла необходимость в повторении однотипного кода. Чтобы не нагружать скрипт, планирую выделить необходимый код в отдельную функцию, чтобы потом просто вызвать ее. Однако не могу понять, как правильно осуществить вызов.

   procedure Hide_Components (Sender: TObject);
var
    i: integer;
    lr,lrd,lrpc: TLabel;
    er: TEdit;

begin
    for i:= 1 to 10 do 
    begin
        lr:=TLabel(Form2.FindComponent('LRes'+IntToStr(i)));
        lrd:=TLabel(Form2.FindComponent('LResDelta'+IntToStr(i)));
        lrpc:=TLabel(Form2.FindComponent('LRespc'+IntToStr(i)));
        er:=TEdit(Form2.FindComponent('ERes'+IntToStr(i)));
        lr.Enabled:=false;
        lrd.Enabled:=false;
        lrpc.Enabled:=false;
        er.Enabled:=false;
        er.Text:='';
    end;
end;

Должно получиться нечто вроде

procedure Form2_Button1_OnClick(Sender: TObject);
begin
    if .... rhen
    .......
    Hide_Components ();
end;

Я не прошу писать за меня готовое решение - понимаю, что работы и помимо этого навалом. Но, возможно, Вы точно знаете, где можно подсмотреть пример для моего случая? Возможно, решение есть в известных Вам проектах. На сторонних форумах, которые я изучал, по подобным вопросам в основном приводятся примеры с простейшими математическими вычислениями (типа а+в), что мне не подходит.
Заранее благодарю за любую помощь.

(Sender: TObject); - (просит Вас что-то передать)
тоесть тут Hide_Components (НУЖНО ЧТО_ ТО ПЕРЕДАТЬ );

 
можете просто использовать название процедуры без скобок
procedure Hide_Components;
тогда она будет вызываться так
Hide_Components;

Re: Вопросы от неразбирающегося

Так у вас уже код оформлен как отдельная процедура, которая может быть вызвана откуда угодно, опишите пожалуйста подробней, что именно не получается?

Dmitry.

28 (edited by Vyvern 2019-06-20 20:58:08)

Re: Вопросы от неразбирающегося

sibprogsistem wrote:

можете просто использовать название процедуры без скобок
procedure Hide_Components;
тогда она будет вызываться так
Hide_Components;

Прошу прощения, не сразу заметил, что тема на 2 страницу перешла... Чуть позже сам допер, что так надо сделать.

Re: Вопросы от неразбирающегося

Здравствуйте!
Есть парочка вопросов.
1) Как сделать так, чтобы несколько функций обращались к одному и тому же массиву, но прописать его всего 1 раз, а не в каждой функции? Т.е. вынести его как глобальную, что ли. Пример: есть такое

procedure Form1_Combobox1_OnChange (Sender: TObject);
var
   i: integer;
   key: array[1..10] of string;
   value: array[1..10] of string;
begin
   key[1]:'k1';key[2]:'k2';.....key[10]:='k10';
   value[1]:'v1';value[2]:'v2';.....value[10]:='v10';
   for i:=1 to 10 do begin
      if Form1.Combobox1.Text=key[i] then begin
         Form1.Edit1.Text:=value[i];
      end;
end;

procedure Form1_Combobox2_OnChange (Sender: TObject);
var
   i: integer;
   key: array[1..10] of string;
   value: array[1..10] of string;
begin
   key[1]:'k1';key[2]:'k2';.....key[10]:='k10';
   value[1]:'v1';value[2]:'v2';.....value[10]:='v10';
   for i:=1 to 10 do begin
      if Form1.Combobox2.Text=key[i] then begin
         Form1.Edit1.Text:=value[i];
      end;
end;

procedure Form1_Combobox3_OnChange (Sender: TObject);
var
   i: integer;
   key: array[1..10] of string;
   value: array[1..10] of string;
begin
   key[1]:'k1';key[2]:'k2';.....key[10]:='k10';
   value[1]:'v1';value[2]:'v2';.....value[10]:='v10';
   for i:=1 to 10 do begin
      if Form1.Combobox3.Text=key[i] then begin
         Form1.Edit1.Text:=value[i];
      end;
end;

Нужно как-то так:

   key: array[1..10] of string;
   value: array[1..10] of string;
   key[1]:'k1';key[2]:'k2';.....key[10]:='k10';
   value[1]:'v1';value[2]:'v2';.....value[10]:='v10';

procedure Form1_Combobox1_OnChange (Sender: TObject);
var
   i: integer;
begin
   for i:=1 to 10 do begin
      if Form1.Combobox1.Text=key[i] then begin
         Form1.Edit1.Text:=value[i];
      end;
end;

procedure Form1_Combobox2_OnChange (Sender: TObject);
var
   i: integer;
begin
   for i:=1 to 10 do begin
      if Form1.Combobox2.Text=key[i] then begin
         Form1.Edit1.Text:=value[i];
      end;
end;

procedure Form1_Combobox3_OnChange (Sender: TObject);
var
   i: integer;
begin
   for i:=1 to 10 do begin
      if Form1.Combobox3.Text=key[i] then begin
         Form1.Edit1.Text:=value[i];
      end;
end;

2) Есть ли другие способы указать путь к файлу (в данном случае картинке), кроме как такой:

Form2.Image1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Images\'+ Form2.Edit1.Text +'\'+ Form2.Combobox1.Text +'.png');

\'+ Form2.Edit1.Text +'\ - это название папки в зависимости от значения Edit1.

30 (edited by sibprogsistem 2020-06-14 07:38:15)

Re: Вопросы от неразбирающегося

var
key: array[1..10] of string;
value: array[1..10] of string;

//Ваши функции...

begin
end.

Re: Вопросы от неразбирающегося

sibprogsistem wrote:
var
key: array[1..10] of string;
value: array[1..10] of string;

Спасибо!
Сделал так:
var
   key: array[1..10] of string;
   value: array[1..10] of string;


//Ваши функции...


begin
   key[1]:'k1';key[2]:'k2';.....key[10]:='k10';
   value[1]:'v1';value[2]:'v2';.....value[10]:='v10';
end.
Пока все работает.


А что насчет альтернативных способов прописывания путей?

Re: Вопросы от неразбирающегося

Здравствуйте!
Как закрепить компонент Label в определенном месте на форме для получения эффекта центрирования (как в Word, например)? Чтобы Label вне зависимости от количества символов все время был "по центру".
И можно ли в Label переносить не по одному слову, а в определенных рамках, как в Memo?

Re: Вопросы от неразбирающегося

Здравствуйте!
Как интегрировать в проект свой шрифт, чтобы он работал только во время использования базы данных?

34 (edited by vovka3003 2020-06-29 05:44:13)

Re: Вопросы от неразбирающегося

Vyvern wrote:

Как интегрировать в проект свой шрифт, чтобы он работал только во время использования базы данных?

Из-за отсутствия нужных функций в программе - это невозможно.

Re: Вопросы от неразбирающегося

vovka3003 wrote:
Vyvern wrote:

Как интегрировать в проект свой шрифт, чтобы он работал только во время использования базы данных?

Из-за отсутствия нужных функций в программе - это невозможно.

Изначальная концепция неверная. Для обычных windows-приложений необходимые шрифты включаются в дистрибутив и устанавливаются вместе с приложением. Свои собственные шрифты, не регистрируемые в системе, могут себе позволить игры и другие программы, использующие DirectX и/или свои собственные технологии для рендера шрифтов (векторные, текстурные, пиксельные и т.д.).

Визуальное программирование: блог и телеграм-канал.

Re: Вопросы от неразбирающегося

Vyvern wrote:

Здравствуйте!
Как закрепить компонент Label в определенном месте на форме для получения эффекта центрирования (как в Word, например)? Чтобы Label вне зависимости от количества символов все время был "по центру".
И можно ли в Label переносить не по одному слову, а в определенных рамках, как в Memo?

Вы можете центрировать текст внутри метки (Alignment = taCenter), а саму метку привязать якорями (Anchors = [Left,Right,Top]) к правому и левому краю формы.  Перенос работает по словам, но вы можете программно добавить код перевода строки для принудительного переноса

MainForm.Label1.Caption := 'Первая строка'+chr(10)+'Вторая строка'
Визуальное программирование: блог и телеграм-канал.

Re: Вопросы от неразбирающегося

k245 wrote:

Изначальная концепция неверная. Для обычных windows-приложений необходимые шрифты включаются в дистрибутив и устанавливаются вместе с приложением. Свои собственные шрифты, не регистрируемые в системе, могут себе позволить игры и другие программы, использующие DirectX и/или свои собственные технологии для рендера шрифтов (векторные, текстурные, пиксельные и т.д.).

Вы про какую концепцию? Я искал решение этого вопроса на форумах по Дельфи, и что-то даже нашел, но, увы, не понял, как это все работает. Предлагалось создать некий RC файл, как-то его то ли проверять, то ли регистрировать. А затем уже при открытии формы устанавливать файл шрифта (в ОС, как я понял), а при закрытии формы - удалять (просто чтобы не мусорить на другом компе). Если б такое можно было бы сделать в MVD, было бы хорошо.

Re: Вопросы от неразбирающегося

k245 wrote:

Вы можете центрировать текст внутри метки (Alignment = taCenter), а саму метку привязать якорями (Anchors = [Left,Right,Top]) к правому и левому краю формы.  Перенос работает по словам, но вы можете программно добавить код перевода строки для принудительного переноса

MainForm.Label1.Caption := 'Первая строка'+chr(10)+'Вторая строка'

Спасибо за ответ!
Мне нужно, чтобы текст в Label работал именно как в Ворде при центрировании, т.е. слова выравнивались и симметрично переносились на новые строки автоматически. Возможно, в MVD это просто пока не реализовано (если такое вообще реализуемо применительно к Label).
Просто я в качестве фона использую картинку, и хотелось бы, чтобы на ней был виден только текст (Edit и Memo этого, увы, не позволяют из-за невозможности сделать их фон 100% прозрачным).

Re: Вопросы от неразбирающегося

Vyvern wrote:

Вы про какую концепцию? Я искал решение этого вопроса на форумах по Дельфи, и что-то даже нашел, но, увы, не понял, как это все работает. Предлагалось создать некий RC файл, как-то его то ли проверять, то ли регистрировать. А затем уже при открытии формы устанавливать файл шрифта (в ОС, как я понял), а при закрытии формы - удалять (просто чтобы не мусорить на другом компе). Если б такое можно было бы сделать в MVD, было бы хорошо.

Установка шрифта - это копирование файлов со шрифтами в папку windows\fonts  В Win7 это проблем не вызывает, в Win10 может не прокатить из-за настройки системы безопасности.  Использовать ресурсы для хранения шрифтов в MVD не получится. Но это и не обязательно - храните их в отдельной папке или базе данных  (если хотите их "прятать" от пользователя ).


P.S. ИМХО, копировать файлы шрифтов при каждом запуске программы - это моветон )))

Визуальное программирование: блог и телеграм-канал.

Re: Вопросы от неразбирающегося

k245 wrote:

Но это и не обязательно - храните их в отдельной папке или базе данных  (если хотите их "прятать" от пользователя ).

Можно с этого места подробнее? Хранить-то шрифт не проблема, а как его задействовать?

k245 wrote:

P.S. ИМХО, копировать файлы шрифтов при каждом запуске программы - это моветон )))

Видимо, для кого-то это меньшее из зол smile

Re: Вопросы от неразбирающегося

Наверное проще автору добавить соответствующий набор функций из Gdi32 для использования шрифтов без установки. Все остальное - жёсткий костылинг, который разве что врагу можно порекомендовать...

Re: Вопросы от неразбирающегося

Vyvern wrote:

Можно с этого места подробнее? Хранить-то шрифт не проблема, а как его задействовать?

Как я писал ранее, установка шрифта - это копирование файлов со шрифтами в папку windows\fonts


P.S. Странно, что вопрос со шрифтами так остро встал для программы, работающей с базами данных )))

Визуальное программирование: блог и телеграм-канал.

43 (edited by vovka3003 2020-06-30 10:07:57)

Re: Вопросы от неразбирающегося

k245 wrote:

P.S. Странно, что вопрос со шрифтами так остро встал для программы, работающей с базами данных )))

Дык эстетичное оформление и стилизацию никто ж не отменял... И если упираться в "базы данных", то можно вообще тогда отменить все плюшки и сказать усерам: "вам что, слабо select `id`, `name`, `phone` from klients where name=`иванов` руками написать..? (зачем нужен удобный интерфейс?)"

Re: Вопросы от неразбирающегося

Я не против эстетики (функциональной), но если архитектурой Windows предполагается установка нужных шрифтов в системную папку, зачем городить огород и придумывать изощрённые способы обойти это правило?  Но это уже философская тема пошла ))))

Визуальное программирование: блог и телеграм-канал.

Re: Вопросы от неразбирающегося

Я сам "за" мобильность, портабельность и минимальный "мусор" в системе. Шрифты ещё ладно, но когда прога весом в несколько мегабайт просит подтянуть для полноценной работы какой-нибудь net framework или java-машину - это некомильфо (имхо).
С шрифтами - возможность их мобильности есть, сам проверял, но ее нет в увы в MVDb...

46 (edited by Vyvern 2020-07-01 16:34:18)

Re: Вопросы от неразбирающегося

Здравствуйте! Как "одним махом" очистить несколько комбобоксов?
Вариант типа
Form1.ComboBox1.Clear;
Form1.ComboBox2.Clear;
Form1.ComboBox3.Clear;
Form1.ComboBox4.Clear;
Form1.ComboBox5.Clear;
как-то не комильфо.


Способ ниже не работает.
for i:=1 to 5 do begin
     cb:=TComboBox(Form1.FindComponent('ComboBox'+IntToStr(i)));
     cb.Clear; \\выделяет красным строку (при этом в var указано cb: TComboBox;)
end;
Где тут ошибка? Подобное вообще работает в MVD?

Re: Вопросы от неразбирающегося

Здравствуйте. Работает.

procedure talon2_Button3_OnClick (Sender: TObject; var Cancel: boolean);
var
nameCombo, j: string;
begin
nameCombo:='Form1.ComboBox.';                        //в переменную общее имя комбобоксов
for i:=1 to 5 do
begin
   j:=nameCombo+IntToStr(i)+'.Clear';                 //цикл очистки по счетчику i
end;
end;

Yana

48 (edited by Vyvern 2020-07-03 16:41:06)

Re: Вопросы от неразбирающегося

adiziktdy wrote:

Здравствуйте. Работает.

procedure talon2_Button3_OnClick (Sender: TObject; var Cancel: boolean);
var
nameCombo, j: string;
begin
nameCombo:='Form1.ComboBox.';                        //в переменную общее имя комбобоксов
for i:=1 to 5 do
begin
   j:=nameCombo+IntToStr(i)+'.Clear';                 //цикл очистки по счетчику i
end;
end;

Увы, Ваш вариант не работает. Как я только не пробовал. Даже с 1 не работает. Кроме того, наверное, в nameCombo не нужна точка после ComboBox, ведь тогда, по логике, получится 'Form1.ComboBox.1.Clear' вместо 'Form1.ComboBox1.Clear'.


Upd: С Label и Edit подобные схемы работают. Может, для ComboBox нужно нечто другое?

Re: Вопросы от неразбирающегося

Hello Wywern

I use this procedure I wrote long ago to clear all components on a form with one shot :
Please see Attachment.

Take only the component you wnt clear.
Hope this can help you
JB

Post's attachments

Attachment icon Clear_Components.txt 1.45 kb, 286 downloads since 2020-07-03 

Re: Вопросы от неразбирающегося

Hello, JB! Thanks you very much for your example! However, I am looking for a way to not only clean comboboxes, but also to loop them. Label and Edit looping methods (which I know) do not work for Combobox in MVD. That's the problem...