Вопрос № 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 оттуда брала данные на печать?
Отвечает: Виктор Пырлик
Здравствуйте, Кривцов Александр!
Я не задавался целью оптимизировать ваш код, поэтому, скажу лишь одно - стоит пересмотреть в целом. Но, это должно быть именно ваше решение :)
А вот по ошибкам скажу - проблема в том, что вы работаете с адресами, это сама по себе тема довольно скользкая в плане программирования. В общем, что бы у вас корректно отрабатывали адреса (не сбивались и не заполнялись мусором) надо во первых - выделить память под массив (это вы делаете) во вторых, для каждого элемента массива тоже выделять память и в него уже копировать значение. Код дан в приложении.
Так же, в модуле библиотеки, надо делать определение функции так: 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 для проверки
существования файла.
Отвечает: 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 Комментарий оценки: Большое Спасибо за исходник поможет при написании и еще Огромное спасибо Выручили