Вопрос № 38724: Здравствуйте, эксперты!
Подскажите, п-та, как организовать case со строковыми переменными. ...Вопрос № 38727: Всем привет!
Недавно возникла задачка построить MDI-приложение. Вот с чем я столкнулся и решения пока не нашел: 1. Как предотвратить запуск нескольких MDI-Child форм (например "Товары"). 2. Как в меню (или др. компоненте) отобразить спи...Вопрос № 38753: Добрый день! Уважаемые эксперты!
У мени несколько вопросов!
1) Если в проекте 2 формы как из одного кода ссылаться на функцию в другом юните?
2) Как сделать, чтобы в dll были тока картинки?
3) Почему при загрузки функции из dll происх...Вопрос № 38776: Здравствуйте эксперты! Как можно в Delphi найти в определенном каталоге все файлы с заданным расширением?...Вопрос № 38795: Помогите написать процедуру которая обрабатывает матицу различной размерности (MxN). Например ищет минимальный элемент. Получается только фиксированная размерность....
Вопрос № 38.724
Здравствуйте, эксперты!
Подскажите, п-та, как организовать case со строковыми переменными.
Отправлен: 28.03.2006, 09:16
Вопрос задал: Ramil (статус: Посетитель)
Всего ответов: 6 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Николай Б.
Здравствуйте, Ramil!
Никак. case не работает со строками.
Можно использовать только if.
Ответ отправил: Николай Б. (статус: 4-ый класс)
Ответ отправлен: 28.03.2006, 09:23
Отвечает: Лучников Ю.В.
Здравствуйте, Ramil!
Вот выдержка из Хелпа по конструкции case: The case statement may provide a readable alternative to deeply nested if conditionals. A case statement has the form
case selectorExpression of
caseList1: statement1;
...
caseListn: statementn;
end
where selectorExpression is any expression of an ordinal type (string types are invalid) and each caseList is one of the following:
A numeral, declared constant, or other expression that the compiler can evaluate without executing your program. It must be of an ordinal type compatible with selectorExpression. Thus 7, True, 4 + 5 * 3, 'A', and Integer('A') can all be used as caseLists, but variables and most function calls cannot. (A few built-in functions like Hi and Lo can occur in a caseList. See Constant expressions.)
A subrange having the form First..Last, where First and Last both satisfy the criterion above and First is less than or equal to Last.
A list having the form item1, ..., itemn, where each item satisfies one of the criteria above.
Обратите внимание на фразу, выделенную жирным!
Другими словами, подобное невозможно...
Выход: использовать конструкцию if-else.
Успехов!
Ответ отправил: Лучников Ю.В. (статус: Профессионал) Россия, Киров WWW:Чат Кировской молодежи ICQ: 176308580 ---- Ответ отправлен: 28.03.2006, 09:26
Отвечает: Malysh
Здравствуйте, Ramil!
Насколько я знаю - то никак. Надо делать через if, и с помощью строковых функций (обязательно).
Ответ отправил: Malysh (статус: Студент)
Ответ отправлен: 28.03.2006, 10:38
Отвечает: Denisss Здравствуйте, Ramil!
Вот так:
var s: string ...
// С учетом регистра
if (s = 'Строка1') then
begin ...
end // Без учета регистра
else if (AnsiUpperStr(s) = 'СТРОКА2') then
begin ...
end;
Конечно, не case, но нечто похожее, реализованное с помощью if.
А в case можно использовать только данные размером не больше 1 байта (т.е. byte, char, set и т.д.).
Ответ отправил: Denisss (статус: Специалист)
Ответ отправлен: 28.03.2006, 14:33
Отвечает: Злоумышленник
Здравствуйте, Ramil!
case используется с перечисляемыми типами, а строковый тип таким не является.
Ответ отправил: Злоумышленник (статус: 5-ый класс)
Ответ отправлен: 28.03.2006, 17:30
Отвечает: Boriss
Здравствуйте, Ramil!
И тем, не менее, если очень нужно (это Вам вопрос задали, так думаю), то практически только два варианта:
case String1 > String2 of
FALSE:;
ELSE
end;
и
Case String1[i] of
'a'..'z':;
'а'..'я':;
ELSE
end;
--------- Вывод - то место в тексте, где вы устали думать
Ответ отправил: Boriss (статус: Профессор) Россия, Саранск Организация: факультет Электронной техники, Мордовский госуниверситет Адрес: г. Саранск WWW:Программирование на Паскале ---- Ответ отправлен: 28.03.2006, 17:48
Вопрос № 38.727
Всем привет!
Недавно возникла задачка построить MDI-приложение. Вот с чем я столкнулся и решения пока не нашел: 1. Как предотвратить запуск нескольких MDI-Child форм (например "Товары"). 2. Как в меню (или др. компоненте) отобразить список открытых MDI-Child форм.
Заранее спасибо.
Приложение:
Отправлен: 28.03.2006, 09:30
Вопрос задал: xXx (статус: 5-ый класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Jadd
Здравствуйте, xXx!
Нет. С assigned не надо делать. Сделайте глобальный флаг или, в конец, именованный мьютекс, чтобы проверять есть такой объект или нет (хотя такое неоправданно будет расходовать ресурсы винды, т.к. переключение с пользовательского уровня на уровень системы и обратно у винды занимает 1000 тактов, что будет расточительством.), или просто сохраняйте имена открытых окон, если они не меняются. Выход всегда есть.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал) Адрес: Санкт-Петербург WWW:http://www.sport-diary.ru ICQ: 28260749 ---- Ответ отправлен: 28.03.2006, 11:38
Отвечает: Leshiy2006
Здравствуйте, xXx! Примерно так:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if Form1.MDIChildCount<1 then begin
f:=TForm2.Create(Self);
f.Show;
end;
end;
Удачи!
Ответ отправил: Leshiy2006 (статус: 6-ой класс)
Ответ отправлен: 28.03.2006, 23:33
Вопрос № 38.753
Добрый день! Уважаемые эксперты!
У мени несколько вопросов!
1) Если в проекте 2 формы как из одного кода ссылаться на функцию в другом юните?
2) Как сделать, чтобы в dll были тока картинки?
3) Почему при загрузки функции из dll происходит ошибка плана EAcsessViolation? или чтото в таком духе!
Отвечает: Полховский Александр Владимирович
Добрый день, Грицай Алексей Юрьевич!
Пока только на первый отвечу:
после implementation объявить нужный модуль (unit) в разделе uses:
Отвечает: sir henry
Здравствуйте, Грицай Алексей Юрьевич!
1. Если Вы собираетесь из модуля Unit1 обращатся к функциям модуля Unit2, то добавьте в строке Uses раздела Implementation модуля Unit1 модуль Unit2.
2. Кладете картинку в ресурс, компилируете его, в модуле DLL'ки подключаете этот ресурс {$R kartinka.res}, потом компилируете модуль.
3. Потому что Вы неправильно обращаетесь к этой функции. Обязательно отследите, чтобы в ссылке на функцию стоял либо адрес этой функции, либо NIL. А судя по тому, что Вы написали, Ваша программа обращается за яблоками куда-то на северный полюс. :)
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 28.03.2006, 15:51
Отвечает: Ataman N. N.
Здравствуйте, Грицай Алексей Юрьевич!
Ответ на вопрос №1.
Например, нужно в Unit2 вызвать функцию/процедуру из Unit1.
Пишем первый модуль.
unit Unit1;
interface
uses .............................;
procedure MyProc;
function MyFunc: Byte;
implementation
procedure MyProc;
begin
end;
function MyFunc: Byte;
begin
end;
.............................................
end.
Пишем второй модуль.
unit Unit1;
interface
uses .............................{, Unit1 если Вы хотите использовать в описании формы, типы данных, описанные в первом модуле};
implementation
uses Unit1; //В Вашем случаи.
.............................................
end.
Одно пожелание, пишите грамотнее.
Ответ отправил: Ataman N. N. (статус: Студент)
Ответ отправлен: 28.03.2006, 17:32
Вопрос № 38.776
Здравствуйте эксперты! Как можно в Delphi найти в определенном каталоге все файлы с заданным расширением?
Отвечает: Лукьяненко Алексей Валериевич
Здравствуйте, Сергей Николаевич!
Для этого нужно использовать функции FindFirst(задаются параметры поиска), и далее в цикле выполнять FindNext. По окончании поиска (результат FindNext = False) вызвать FindClose.
Отвечает: Королёв Руслан
Здравствуйте, Сергей Николаевич!
Список файлов находится с помощью связки FindFirst FindNext в приложении программа, которая выводит все файлы в корне c: с расширением ini
Приложение:
Ответ отправил: Королёв Руслан (статус: 3-ий класс)
Ответ отправлен: 28.03.2006, 19:24
Отвечает: AlexanderR
Здравствуйте, Сергей Николаевич!
Для этого существуют функции:
function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer; - начало поиска, если возвращает 0 то все ок, иначе код ошибки.
function FindNext(var F: TSearchRec): Integer; - продолжить поиск.
В приложении функция для примера. Параметры ф-ции Find: Dir - исходная директория для поиска; SubDir - поиск во вложенных директориях; Ext - расширение искомых файлов.
Удачи!
Приложение:
--------- Если ты хочешь понять я тебе помогу, но я не буду выполнять за тебя твою работу.
Ответ отправил: AlexanderR (статус: 1-ый класс)
Ответ отправлен: 28.03.2006, 20:40
Отвечает: sir henry
Здравствуйте, Сергей Николаевич!
С помощью связки функций FindFirst()-FindNext().
В FindFirst() задается каталог и шаблон для поиска и он находит первый файл по шаблону. Далее в цикле применяется FindNext() до тех пор, пока все файлы не будут найдены.
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 29.03.2006, 06:36
Вопрос № 38.795
Помогите написать процедуру которая обрабатывает матицу различной размерности (MxN). Например ищет минимальный элемент. Получается только фиксированная размерность.
Отвечает: Ujin Antikvar
Здравствуйте, Иванов Михаил Викторович!
Используй динамические массивы и не будет ограничений.
Пример нахождения min элемента динамического массива
const n=6, m=10;
var a: array of array of Real; //Задание динамического массива
min:real;
i,j:integer;
begin
SetLength(a,n); //Установка размерности массива
for i := 0 to High(a) do
SetLength(a[i], m);
...........
{*Здесь ввод массива*}
...........
min:=a[1,1];
for i:=1 to n do
begin
for j:=1 to m do
begin
if (min>a[i,j])
min:=a[i,j];
end;
end;
{*Вывод числа*}
если массив больше не используется то в конце его рекомендуется обнулить функцией SetLength(a,0) установив размерность равную нулю
P.S. одномерный динамический массив объявляется также как и двумерный.
a:array of <Тип данных>
SetLength(a,<длина массива>)
Вот и все
Удачи!!!
--------- "Будущее принадлежит тем, кто верен своей мечте" - Элеонора Рузвельт
Ответ отправил: Ujin Antikvar (статус: 6-ой класс)
Ответ отправлен: 28.03.2006, 22:11
Отвечает: AlexanderR
Здравствуйте, Иванов Михаил Викторович!
type
TMatrix = array of array of integer;
function GetMinElement(Matrix:TMatrix):integer;
var i,j:integer;
begin
Result := Matrix[0,0];
for i := 0 to High(Matrix) do
begin
for j := 0 to High(Matrix[i]) do
begin
if Matrix[i,j] < Result then Result := Matrix[i,j];
end;
end;
end;
Удачи!
Приложение:
--------- Если ты хочешь понять я тебе помогу, но я не буду выполнять за тебя твою работу.
Ответ отправил: AlexanderR (статус: 1-ый класс)
Ответ отправлен: 29.03.2006, 11:13
Отвечает: Ataman N. N.
Здравствуйте, Иванов Михаил Викторович!
В Delphi можно работать с динамическими массивами. Создать массив размерности MxN можно так:
var Matrix: array of array of integer;//объявили "матрицу"
/////инициализация
SetLength(Matrix, M);
for i := 0 to M - 1 do
SetLength(Matrix[i], N);
Все можно работать с матрицей.
Не забудьте уничтожить массив после окончания работы приложения.
/////уничтожение массива
for i := 0 to M - 1 do
SetLength(Matrix[i], 0);
SetLength(Matrix, 0);
Ответ отправил: Ataman N. N. (статус: Студент)
Ответ отправлен: 29.03.2006, 17:31