Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 432
от 03.04.2006, 05:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 294, Экспертов: 69
В номере:Вопросов: 5, Ответов: 18


Вопрос № 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? или чтото в таком духе!
Отправлен: 28.03.2006, 14:01
Вопрос задал: Грицай Алексей Юрьевич (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Полховский Александр Владимирович
Добрый день, Грицай Алексей Юрьевич!
Пока только на первый отвечу:
после implementation объявить нужный модуль (unit) в разделе uses:

uses
unit1;

.......
form1.Button1.Click(nil);
.......

---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Практикант)
Ответ отправлен: 28.03.2006, 15:25

Отвечает: 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 найти в определенном каталоге все файлы с заданным расширением?
Отправлен: 28.03.2006, 18:18
Вопрос задал: Сергей Николаевич (статус: 1-ый класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лукьяненко Алексей Валериевич
Здравствуйте, Сергей Николаевич!
Для этого нужно использовать функции FindFirst(задаются параметры поиска), и далее в цикле выполнять FindNext. По окончании поиска (результат FindNext = False) вызвать FindClose.
Ответ отправил: Лукьяненко Алексей Валериевич (статус: 1-ый класс)
Ответ отправлен: 28.03.2006, 18:23

Отвечает: Королёв Руслан
Здравствуйте, Сергей Николаевич!
Список файлов находится с помощью связки 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; - продолжить поиск.

procedure FindClose(var F: TSearchRec); - завершить поиск.

В приложении функция для примера. Параметры ф-ции 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). Например ищет минимальный элемент. Получается только фиксированная размерность.
Отправлен: 28.03.2006, 21:33
Вопрос задал: Иванов Михаил Викторович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.21 (beta) от 02.04.2006
Яндекс Rambler's Top100

В избранное