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

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


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

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

Выпуск № 917
от 07.09.2007, 04:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 466, Экспертов: 73
В номере:Вопросов: 4, Ответов: 12


Вопрос № 100435: Здравствуйте! Я выношу функцию печати в отдельный DLL. Но в библиотеку надо передавать данные. Использую форму с QuickReport, на которой динамически создаю метки (QRLabel). С метками проблем нет, а есть проблема с передачей массива строк....
Вопрос № 100461: Здравствуйте уважаемые!Вопрос у меня следующий:чтобы создать и записать текстовый файл я пишу AssignFile(f,FileName); Rewrite(f); ..... ну и соответствено,что бы открыть его для чтения AssignFile(f,FileName); Reset(f);.....,а как ...
Вопрос № 100483: Здравствуйте, Уважаемые Эксперты!!! Помогите, пожалуйста, разобраться с функциями программиста. Как их надо правильно писать? Допустим, мне нужно найти максимальное число из двух чисел, введенных с клавиатуры. Я хотела сделать так, но мне выводятся о...
Вопрос № 100486: Здравствуйте Вы не скажите как можно сделать автосбор пятнашек(т.е чтобы автоматически происходил сбор) очень нужно или описать подробно алгоритм сбора желательно бы исходник. С уважением Сергей...

Вопрос № 100.435
Здравствуйте!
Я выношу функцию печати в отдельный DLL. Но в библиотеку надо передавать данные.
Использую форму с QuickReport, на которой динамически создаю метки (QRLabel).
С метками проблем нет, а есть проблема с передачей массива строк.
Из программы я формирую строки типа "12345/2/Название товара/146/" и передаю их в массив Codes (с динамическим массивом проблем нет, сколько строк передается, столько и отображается). Потом в DLL я "шинкую" эту строку на составляющие, расположенные между символами-разделителями.
В DLL строки передаются правильно (проверял ShowMessage), а итоговые (полученные библиотекой) получаются неверные.
То в конце добавляется лишний символ, то съедается мой символ-разделитель, строк иногда нет, и еще почему-то строка с индексом "0" (ноль) (динамический массив!!!), получается та-же, что и 4-я!!!
Еще пробовал с другими символами-разделителями (@, #, $, ;) - результат тот-же.
Если передавать данные не в одной строке, а каждую отдельно (массив Codes заменить 4-мя), то все ОК.
Вопросы:
1. Что не так в моем коде?
2. Предложите вариант беспроблемной передачи данных
3. Есть ли смысл делать временный файл на диске, а потом чтобы DLL оттуда брала данные на печать?

Приложение:

Отправлен: 01.09.2007, 13:58
Вопрос задал: Кривцов Александр (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Виктор Пырлик
Здравствуйте, Кривцов Александр!

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

Так же, в модуле библиотеки, надо делать определение функции так:
function PrintProba(Codes:array of PChar):boolean;stdcall ;

Приложение:

---------
Если ничего не помогло - надо читать инструкцию

Ответ отправил: Виктор Пырлик (статус: Студент)
Ответ отправлен: 01.09.2007, 17:04
Оценка за ответ: 4


Вопрос № 100.461
Здравствуйте уважаемые!Вопрос у меня следующий:чтобы создать и записать текстовый файл я пишу
AssignFile(f,FileName);
Rewrite(f);
..... ну и соответствено,что бы открыть его для чтения
AssignFile(f,FileName);
Reset(f);.....,а как мне перед тем как открыть проверить существует ли он и если нет выдать сообщение,
существует ли в delphi функция наподобе проверки существования директории - DirectoryExists для проверки
существования файла.
Отправлен: 01.09.2007, 18:26
Вопрос задал: Зотов Геннадий Александрович (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Gh0stik
Здравствуйте, Зотов Геннадий Александрович!

Да такая функция существует - function FileExists(const FileName: String): Boolean;

Пример использования:


begin
if FileExists(FileName) then
... // Файл существует
else
... // Файл не существует
end;


Good Luck!!!
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Профессор)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 01.09.2007, 18:38
Оценка за ответ: 5
Комментарий оценки:
Спасибо за быстрый ответ

Отвечает: Esi
Здравствуйте, Зотов Геннадий Александрович!
Это функция Fileexists( 'путь + имя файла')
Ответ отправил: Esi (статус: 2-ой класс)
Ответ отправлен: 01.09.2007, 18:50
Оценка за ответ: 5

Отвечает: Coupler
Здравствуйте, Зотов Геннадий Александрович!
Также можно воспользоваться функцией function IOResult: Integer;, возвращающей результат последней операции ввода-вывода, если используется директива {$I-}. Пример в приложении.

Приложение:

Ответ отправил: Coupler (статус: Практикант)
Ответ отправлен: 01.09.2007, 19:00
Оценка за ответ: 5
Комментарий оценки:
Спасибо запомню и это

Отвечает: Shurka
Здравствуйте, Зотов Геннадий Александрович!

function FileExists(const FileName: string): Boolean;
В хелпе не дано посмотреть что ли ?! :)
//умным может стать лишь тот, кто задавал глупые вопросы.
Ответ отправил: Shurka (статус: 2-ой класс)
Ответ отправлен: 01.09.2007, 20:59
Оценка за ответ: 5
Комментарий оценки:
Shurka я смотрю тебе тоже не дано ответы других посмотреть

Отвечает: Алексей Акишин
Здравствуйте, Зотов Геннадий Александрович!
Можно написать так.
AssignFile(f,FileName);
If FileExists(f) then reset(f) else rewrite(f);
...

---------
Что бы ни делать - лишь бы ничего не делать!
Ответ отправил: Алексей Акишин (статус: 2-ой класс)
Ответ отправлен: 02.09.2007, 04:11
Оценка за ответ: 5
Комментарий оценки:
Спасибо уже разобрался

Отвечает: Дмитрий С.
Здравствуйте, Зотов Геннадий Александрович!
Чтобы проверить существует ли заданный файл - есть стандартная функция FileExist(путь_к_файлу); Она возвращает TRUE если файл существует или FALSE в противном случае.
---------
Наши программисты самые программистые программисты!..
Ответ отправил: Дмитрий С. (статус: 3-ий класс)
Ответ отправлен: 03.09.2007, 15:31
Оценка за ответ: 5
Комментарий оценки:
Спасибо


Вопрос № 100.483
Здравствуйте, Уважаемые Эксперты!!! Помогите, пожалуйста, разобраться с функциями программиста. Как их надо правильно писать? Допустим, мне нужно найти максимальное число из двух чисел, введенных с клавиатуры. Я хотела сделать так, но мне выводятся ошибки

Приложение:

Отправлен: 01.09.2007, 21:19
Вопрос задала: Алена (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Gh0stik
Здравствуйте, Алена!

Данная фраза "Not enough actual parameters" говорит о том, что Вы не передаете в функцию соответствующих параметров, и Ваш пример следовало бы переписать в такой вид:

procedure TForm1.Button1Click(Sender: TObject);
Function max(a,b:integer):integer;
begin
If a > b then max:=a
else max:=b;
end;

Begin
Edit3.Text:=IntToStr(max(StrToInt(Edit1.Text), StrToInt(Edit2.Text)));
end;
end.


А также как видите я удалил из функции строки:
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text);


В данном примере я бы не применял бы такой подход определения переменных в функции.

А вторая ошибка "Could not compile used unit 'Unit1.pas'" является логическим следствием первой.

Good Luck!!!
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Профессор)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 01.09.2007, 21:46
Оценка за ответ: 5

Отвечает: Виктор Пырлик
Здравствуйте, Алена!

Я вам показал, как лучше и понятнее для вас, на данном этапе, работать с функциями.
Функции лучше всего определять отдельно. Уверяю, у вас еще не скоро появится необходимость использовать объявление функций таким способ как вы показали в вашем коде.

Приложение:

---------
Если ничего не помогло - надо читать инструкцию

Ответ отправил: Виктор Пырлик (статус: Студент)
Ответ отправлен: 01.09.2007, 22:36
Оценка за ответ: 5

Отвечает: Shurka
Здравствуйте, Алена!
Попробую объяснить с самого начала. Функция - это "программа в программе", которая ВЫЗЫВАЕТСЯ для того чтобы что-то сделать. А для того чтобы что-то сделать неплохо кое-что знать. А чтобы функция могла что-то узнать, у нее есть ПАРАМЕТРЫ. Когда мы определяем функцию, например так
Function max(a,b:integer):integer;
begin
If a>b then max:=a
else
max:=b;
end;
мы указываем в скобках (a,b:integer) и внутри функции можно использовать переменные a, b, считая, что их значения переданы откуда-то, чтобы функция могла их использовать. Теперь, когда функция определена мы можем ее ВЫЗЫВАТЬ. Когда мы вызываем функцию, она выполняется с теми значениями a и b, которые мы подставим (то есть они ей передаются) и выдает соответственный результат.
Приложение я не привожу, т к Виктор Пырлик написал все отлично.

//{"A new beginning - moment of freedom"}
Ответ отправил: Shurka (статус: 2-ой класс)
Ответ отправлен: 01.09.2007, 23:50
Оценка за ответ: 5


Вопрос № 100.486
Здравствуйте Вы не скажите как можно сделать автосбор пятнашек(т.е чтобы автоматически происходил сбор) очень нужно или описать подробно алгоритм сбора желательно бы исходник.
С уважением Сергей
Отправлен: 01.09.2007, 21:33
Вопрос задал: Agp3000 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: DimonSoft
Здравствуйте, Agp3000!

Я бы посоветовал копать в этом направлении: http://flasher.ru/forum/archive/index.php/t-100168.html

Основная идея упрётся или в то, что шашки перемешиваются самой программой, а последовательность ходов хранится где-нибудь, или, в случае, если просто задаётся расположение шашек, в рекурсию.

Но, конечно, перед тем, как решать эту задачу, проверьте, чтобы она имела решение. На всякий случай процитирую одну книгу...

"Чтобы немного разобраться, когда головоломка поддаётся решению, а когда нет, сыграем для начала не в 15, а в 3. Немного погоняв шашки по коробочке, Вы убедитесь, что из конфигурации 123 получаются лишь 231 и 312, но никогда не получится 132. Переставить местами две шашки не удаётся. Оказывается, здесь и "зарыта собака". В конфигурации 123 царит порядок: числа стоят "по старшинству". В конфигурации 231 порядок нарушен "дважды": 2 больше 1 и 3 больше 1, но они стоят впереди единицы. Точно так же и в расположении 312 сразу два нарушения: 3 больше 1 и 2, но стоит впереди них. Выходит, конфигурация шашек с чётным числом нарушений порядка при передвижении по коробке не теряет чётности (0 - тоже чётное число)! Что же касается расположения 132, где нарушение порядка одно, подвигав шашки, Вы убедитесь, что и нечётность числа нарушений сохраняется.

Это верно не только для игры в 3, но и для игры Лойда. Если число нарушений порядка шашек чётно, головоломку можно привести в требуемый вид, придётся, правда, повозиться; если же оно нечётное - всё равно не получится решения. Выходит, есть два принципиально различных расположения шашек, которые нельзя перевести одно в другое, сколько ни старайся."
Ответ отправил: DimonSoft (статус: 3-ий класс)
Ответ отправлен: 02.09.2007, 10:06
Оценка за ответ: 5
Комментарий оценки:
Огромное Спасибо очень выручил.

Отвечает: Denisss

Здравствуйте, Agp3000!

Алгоритм решения можно посмотреть на здесь: ссылка
Там же выложен исходник на C++ Builder. Т.к. в C++ Builder, так же, как и в Delphi, применяется модель VCL, то особых затруднений по пониманию данных исходников возникнуть не должно.


Добавлено (02.09.2007 14:00 Мск):

Все-таки не смог удержаться и перевел проект из C++ Builder в Delphi (7-я версия). Скачать можно здесь: ссылка [443 K] (Файл будет удален через 1 месяц после последнего скачивания).
Пока переводил, заметил, что перемешивание в примере реализовано не совсем правильно. Поэтому в конце решения может получиться строка, например: 13 15 14 (вместо 13 14 15).

Удачи!
Ответ отправил: Denisss (статус: Профессионал)
Россия, Москва
----
Ответ отправлен: 02.09.2007, 11:10
Оценка за ответ: 5
Комментарий оценки:
Большое Спасибо за исходник поможет при написании и еще Огромное спасибо Выручили


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.58 от 30.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное