k245 wrote:

Массив вам в помощь

Благодарю за подсказку! Помогло.

Здравствуйте! По предыдущему посту разобрался. Возник другой вопрос: как получить из двух переменных одну?
Например, для разных функций нужно получить переменные num1, num2, num3 из "num" и "a:=1", "a:=2" и "a:=3".
Функции однотипные, хочу сократить объем кода не используя переборы. Переменная не имеет привязки к компонентам.
К примеру, в языке луа есть оператор ".." для сцепления. В нем нужная мне переменная выглядела бы так - num..a, и в зависимости от функции она будет возвращать num1, num2 или num3. Но как подобное сделать в дельфи?
Перерыл кучу форумов, но ответ найти не смог.

Здравствуйте!
Можно ли кратко задать переменную типа
сtext1:=Form1.ComboBox1.Text='text1'
сtext2:=Form1.ComboBox1.Text='text2'
и т.д., чтобы не прописывать подобные конструкции каждый раз при проверках?
Или хотя бы общую - сtext:=Form1.ComboBox1.Text?

4

(63 replies, posted in Russian)

Здравствуйте! Наверное, замечание не совсем в тему...
Программа версии 6.5 закрывается при малейшей ошибке, что нередко очень мешает. С предыдущими версиями, не имевшими такового новшества, было удобнее работать. Проблемная строка в конструкторе выделяется - это круто, но часто перезапускать БД то еще "удовольствие"...

Всем здравия!
Не получается инактивировать кнопку, у которой прописана функция (на OnClick). Выдает ошибку "Array type required" в строке
Form1.Button1.Enabled:=false;
При этом с кнопками без функций такой проблемы нет. Версия программы 6.5. Таблиц в этой формуле нет.

k245 wrote:

Ошибка в объявлении переменной cb: используйте класс  TdbComboBox:

Вот оно! Огромное спасибо!

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...

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 нужно нечто другое?

Здравствуйте! Как "одним махом" очистить несколько комбобоксов?
Вариант типа
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?

k245 wrote:

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

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

k245 wrote:

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

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

k245 wrote:

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

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

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

k245 wrote:

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

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

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

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

15

(54 replies, posted in Russian)

Здравствуйте!
Как задать значениям выпадающего списка соответствующие порядковые значения ID (т.е. верхнее значение =1 и далее вниз 2, 3, 4 и т.д.)? Чтобы не были вразнобой. И есть ли способ сделать это в свойствах компонента, а не в скрипте?


Upd: Наверное, проще будет работать с ComboBox.ItemIndex.

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.
Пока все работает.


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

Здравствуйте!
Есть парочка вопросов.
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.

18

(63 replies, posted in Russian)

Здравствуйте!
В скрипте, при вводе текста, а именно любых слов, заканчивающихся на букву "я" (например, так: Form1.Edit1.Text:='Земля'), меняется цвет некоторой части следующего за этим словом кода (синеет), из-за чего становится проблематично работать с ним. Приходится ставить пробел после слова (или_), и все подобные значения сохранять так же.
Данное явление заметил еще в версиях 5.х, но не придал этому значения, потому как не было критично. Сейчас ситуация изменилась...

sibprogsistem wrote:

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

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

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

   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;

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

Hi, Derek!
Thanks for the advice, this method is really useful. Unfortunately, I have just the “very special” case, when it will not be possible so simply to “subordinate all the necessary components to one rule”. Well, you know how it happens smile

Здравствуйте!
Реализуемо ли "групповое" изменение свойств компонентов? Что имеется ввиду: когда компонентов много (штук 20), и все их нужно, к примеру, отключить (через Enabled), то приходится отключать каждый в отдельности. Было бы гораздо удобнее выделив все компоненты в Свойствах компонентов получить общие настройки, и всего 1 нажатием перевести все 20 штук в тот же Enabled false.
Конечно, можно это, наверное, и скриптами сделать, но не охота раздувать многострадальный скрипт:)

Здравствуйте!
Есть код такого вида:

for i:= 1 to 7 do begin
    cbe:=TComboBox(Form2.FindComponent('CBEffector'+IntToStr(i)));
    eev:=TEdit(Form2.FindComponent('EfValue'+IntToStr(i)));
    if (cbe.Text='текст') then begin
        Form2.SDamage.Text:=FloatToStr(0.2*StrToFloat(Form2.TProperty.Text));
        Form2.SDamageDur.Text:=eev.Text;

В общем, получаем значение в одном поле, умножая значение в другом на 0,2. Как в данном случае округлить полученное значение (0.2*StrToFloat(Form2.TProperty.Text)) до целого? Например, 9,4 до 9, а 9,5 и выше уже до 10? Можно ли сделать это прямо в строке
Form2.SDamage.Text:=FloatToStr(0.2*StrToFloat(Form2.TProperty.Text));
?
Заранее спасибо.
P.S. Планируется ли сделать автовыделение круглых кавычек разными цветами (как в формулах Excel), или выделение "активных" кавычек, как реализовано в Notepad++ (что даже лучше)?

Спасибо большое за помощь!

Здравствуйте.
Может ли кто-нибудь подсказать аналог нижеуказанной хэш-таблицы (Lua) для Delphi, а также как к ней правильно обратиться (перебор)?

local tbl_spec =  {
                             ["item1"] = "info1",
                             ["item2"] = "info2",
                             ["item3"] = "info3",
                             ["item4"] = "info4",
                             ["item5"] = "info5"
                            }
for k,v in pairs(tbl) do         --перебираем таблицу