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

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


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

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

Выпуск № 775
от 09.04.2007, 14:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 456, Экспертов: 97
В номере:Вопросов: 6, Ответов: 13


Вопрос № 80871: Подскажите как можно скопировать объект. Если сделать так: Объект1 := Объект2, то в памяти будет находиться только один объект, а скопируется только ссылка на него. Я создаю новый: Объект1 := Тип.Create; Как мне теперь скоп...
Вопрос № 80886: Подскажите пожалуйста. У меня есть Form1 и Form2. На Form1 находится Image1. Как сделать так, что бы на Form2 создавалось n маленьких кусочков Image1. Как будто открытку разрезали на n ровных квадратиков и выложыли попорядку на стол....
Вопрос № 80914: День добрый уважаемые эксперты. У меня есть некий ini файл из которого я считываю данные, выглядит он приблезительно так: [Key] a=1 b=2 ... y=24 z=25 [=26 ;=27 '=28 считываем так: List1:=TStri...
Вопрос № 80943: Доброго времени суток уважаемые эксперты. Есть программа, написанная мною установленная на разных ПК которые имеют доступ к общему FTP, а так же есть новые версии этой же программы, ходить руками всем обновлять файлы долго и лениво пришла ид...
Вопрос № 81020: Здравствуйте! Как можно наложить один image на другой с заданными координатами?...
Вопрос № 81031: Люди помогите с исправлением ошибки в коде (Type 'FileAssemleyImage' needs finalization - not allowed in file type) Я так думаю дело в том что я использую вложенные типы не так как надо. unit fileclass; interface type button ...

Вопрос № 80.871
Подскажите как можно скопировать объект.

Если сделать так: Объект1 := Объект2, то в памяти будет находиться только один объект, а скопируется только ссылка на него.

Я создаю новый: Объект1 := Тип.Create;
Как мне теперь скопировать в Объект1 все данные из Объект2.
Например, что - то типа такого: Объект1^ := Объект2^, но такая строка не работает...

Заранее спасибо...
Отправлен: 03.04.2007, 13:49
Вопрос задал: Kotsa (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Kotsa!
Объект1^ := Объект2^ сработает только если у вас объекты какого-то определенного базового типа. Например, Integer или Real. Можно воспользовать низкоуровневым копированием памяти, но это вряд ли вам понадобится. Для полного копирования объекта пользуйтесь методом Assign
Object1.Assign(Object2); скопирует Object1 в Object2.
UPD: Вначале неправильно написал — перепутал местами Object1 и Object2.
---------
Не узнаешь - не попробуешь.
Ответ отправил: Сухомлин Кирилл Владимирович (статус: Специалист)
Ответ отправлен: 03.04.2007, 14:00

Отвечает: Pavel Maltsev
Здравствуйте, Kotsa!

Для этого в каждом объекте должен быть метод Assign - который как раз и осуществляет копирование. Т.е. должно быть так:

ObjectDest := TMyObject.Create();
ObjectDest.Assign(ObjectSrc);

НО! Метод Assign должен быть определен в объекте, многие программисты просто не создают такие методы в своих объекте... или забывают их переопределить от базовых. Почти во всех стандартных делфийских объектах метод Assign определен корректно
Ответ отправил: Pavel Maltsev (статус: 3-ий класс)
Ответ отправлен: 03.04.2007, 14:00

Отвечает: PGM
Здравствуйте, Kotsa!

Классический способ - для таких вещей у многих объектов есть функция Assign. Object2.Assign(Object1).

Неклассический способ - нарушающий все и вся: если объекты одного типа, то можно сделать Move(Pointer(Obj1)^, Pointer(Obj2)^, Obj1.InstanceSize). Но тут надо быть очень аккуратным - никакой проверки типов и т.п.
Ответ отправил: PGM (статус: 3-ий класс)
Ответ отправлен: 03.04.2007, 18:21


Вопрос № 80.886
Подскажите пожалуйста. У меня есть Form1 и Form2. На Form1 находится Image1. Как сделать так, что бы на Form2 создавалось n маленьких кусочков Image1.
Как будто открытку разрезали на n ровных квадратиков и выложыли попорядку на стол.
Отправлен: 03.04.2007, 15:06
Вопрос задал: Костенко Игорь Викторович (статус: 2-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: PGM
Здравствуйте, Костенко Игорь Викторович!

Есть много разных способов - самый простой - на форме 2 создать Image большего размера (с учетом раздвижек) и копировать туда нужные кусочки функцией BitBlt с первого.

Если надо, чтобы были независимы (ну там двигать мышью их потом) - можно создать много Image и разместить их как надо, а затем скопировать с первого нужные куски.

Если хочется сделать все совсем красиво (уменьшить мигания) - надо сделать производный компонент например от TPanel и обрабатывать все перерисовки и мышь самому, храня кусочки во внутренних структурах.

Ответ отправил: PGM (статус: 3-ий класс)
Ответ отправлен: 03.04.2007, 18:21


Вопрос № 80.914
День добрый уважаемые эксперты.
У меня есть некий ini файл из которого я считываю данные, выглядит он приблезительно так:

[Key]
a=1
b=2
...
y=24
z=25
[=26
;=27
'=28

считываем так:
List1:=TStringList.Create;
IniFile.ReadSection('Key',List1);
Но, в итоге в List1 у меня находится не весь массив данных от " a-' ", а лишь " a-z ". Получатся что дойдя до "[" он перестает дальнейшее чтение...
1) можно ли от этого избавиться и как?
2) если нет, то каким способом можно хранить данные, чтобы их легко можно было редактировать при помощи того же Блокнота?
Отправлен: 03.04.2007, 19:44
Вопрос задал: Human_J (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Архангельский Андрей Германович
Здравствуйте, Human_J!

[ - является специальным символом для ini-файла.

Нужно либо использовать обычный .txt файл и считывать его по строчкам,
либо заменить a,b ... их кодами,
например:
[Key]
x100=1
x101=2
...
---------
Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 03.04.2007, 19:49
Оценка за ответ: 5
Комментарий оценки:
Спасибо, будем пробовать...

Отвечает: PGM
Здравствуйте, Human_J!

1. Избавиться можно заменив "[" на какое-нибудь слово (например, "open"), а после считывания в List1 заменять его обратно (или учитывать просто при обработке).

2. А лучше хранить все в простом текстовом файле (редактируется Блокнотом) и считывать List1.LoadFromFile. Никаких Ini файлов и объектов вообще не нужно. Перевод строки в этом файле эквивалентен одному элементу StringList.
Ответ отправил: PGM (статус: 3-ий класс)
Ответ отправлен: 04.04.2007, 10:15
Оценка за ответ: 5
Комментарий оценки:
Отлично, спасибо!


Вопрос № 80.943
Доброго времени суток уважаемые эксперты.

Есть программа, написанная мною установленная на разных ПК которые имеют доступ к общему FTP, а так же есть новые версии этой же программы, ходить руками всем обновлять файлы долго и лениво пришла идея написать что то типа синхронизатора файлов по FTP.

Подскажите, как лучше реализовать доступ к файла по FTP.

Заранее благодарен. Алексеев А.В.
Отправлен: 03.04.2007, 23:22
Вопрос задал: Алексеев Александр Владимирович (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Базанов Иван Александрович
Здравствуйте, Алексеев Александр Владимирович!
В своих проектах для автоматического обновления я использовал компонент Indy TIdFTP.
На сервер выкладывается новый ехе клиента и файлик с номером версии.
Клиент по FTP соединяется с сервером, сравнивает свою версию с версией на сервере.
Если версия на сервере меньше или равна то просто разрываем соединение и на этом обновление закончено :)
Если версия больше, клиент закрывается, предварительно запустив специальное приложение, которое скачивает новую версию клиента с сервера, после чего опять запускает клиента.

---------
Disassemble your life and get the key
Ответ отправил: Базанов Иван Александрович (статус: 5-ый класс)
Ответ отправлен: 04.04.2007, 09:22
Оценка за ответ: 4
Комментарий оценки:
Огромное спасибо.

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

1. Разместите на форме компонент Indy IdFTP
2. Присвойте свойству TransferType значение ftBinary для пересылки двоичных файлов.
3. Посмотрите в приложении, как отправлять ( процедура TForm1.PutFile ) и как получать ( процедура TForm1.GetFile ) файл с именем Form1.meFileRes.Text, лежащий на FTP сервере в каталоге Form1.mePath.Text

Удачи!

Приложение:

Ответ отправил: Sosedov (статус: 1-ый класс)
Ответ отправлен: 04.04.2007, 16:41
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо!!!

Отвечает: Bingo
Здравствуйте, Алексеев Александр Владимирович!
Для реализации желаемого проекта можно воспользоваться простым FTP сервером (TIdTrivialFTPServer). Допустим, Ваша главная машина будет являться сервером. Для этого создадим для нее отдельную программу: разместим на форме IdTrivialFTPServer1, на вкладке Events выберем основное событие OnReadFile - обработка запроса на чтение файла (запись нам не понадобится). Заведем Memo1, чтобы было удобнее наблюдать за происходящим. Пишем что-то вроде:
---
procedure TForm1.FormCreate(Sender: TObject);
begin
idtrivialftpserver1.Active:=true;
end;

procedure TForm1.IdTrivialFTPServer1ReadFile(Sender: TObject;
var FileName: String; const PeerInfo: TPeerInfo;
var GrantAccess: Boolean; var AStream: TStream;
var FreeStreamOnComplete: Boolean);
begin
Astream:=Tfilestream.Create(filename,fmopenread);
memo1.Lines.Add('Чтение файла '+filename+' с сервера компьютером'+peerinfo.PeerIP);
end;
---
В принципе, наш сервер готов.
Создадим клиент для каждой машины. Будем использовать IdTrivialFTP1. Разместим, к примеру, кнопку, по нажатии которой сработает загрузка файла с сервера:
---
procedure TForm1.FormCreate(Sender: TObject);
begin
idtrivialftp1.Active:=true;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var fs,fc:string;
begin
fs:='{путь к программе на сервере}';
fc:='{путь к месту, куда мы собираемся сохранять файл}';
idtrivialftp1.Get(f,fc);
end;
---
Вообщем, это все. Всю логику работы подобных программ я объяснил. Теперь Вам осталось переделать это под свои нужды.
Удачи!
---------
C темным пивом в светлое будущее!
Ответ отправил: Bingo (статус: 3-ий класс)
Ответ отправлен: 04.04.2007, 20:52
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо.


Вопрос № 81.020
Здравствуйте!
Как можно наложить один image на другой с заданными координатами?
Отправлен: 04.04.2007, 12:48
Вопрос задал: Troyan (статус: 9-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

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

Собственно говоря не вижу особых проблем, просто создаете Image и далее задаете ему нужные координаты и все... :)

В приложении код...

Good Luck!!!

Приложение:

---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.

Ответ отправил: Gh0stik (статус: Профессионал)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 04.04.2007, 13:18
Оценка за ответ: 4
Комментарий оценки:
Я, наверное, не правильно составил вопрос. Мне нужно, чтобы рисунки с разных image наложились и полученный рисунок уже был на третьем image

Отвечает: Ерёмин Андрей
Здравствуйте, Troyan!
См. пример в прикреплённом файле. Для наложение изображений можно просто копировать участки Canvas. Делается это с помощью функции CopyRect(). Координаты для наложения второй картинки на первую я сделал константами, но, естественно, там могут быть и переменные. В приложении только фрагмент кода, в прикреплённом файле - весь проект. Желаю удачи!

Приложение:

Прикреплённый файл: Загрузить >>
Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.

Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Помощь, советы, обмен опытом.
ICQ: 286867644
----
Ответ отправлен: 04.04.2007, 14:17
Оценка за ответ: 5
Комментарий оценки:
Спасибо! Это то, что мне было нужно!


Вопрос № 81.031
Люди помогите с исправлением ошибки в коде
(Type 'FileAssemleyImage' needs finalization - not allowed in file type)
Я так думаю дело в том что я использую вложенные типы не так как надо.
unit fileclass;
interface
type
button = record
Name: string;
SizeX,SizeY: integer;
Enabled: Boolean;
View:boolean;
Index: byte;
CordX,CordY:integer;
Skin:string;
Sound: string;
end;
type
forms = record
Name: string;
SizeX,SizeY: integer;
Enabled: Boolean;
View:boolean;
Index: byte;
Skin:string;
Music:string;
end;
type
edit = record
Name: string;
SizeX,SizeY: integer;
Enabled: Boolean;
View:boolean;
Index: byte;
Text: string;
end;
type
image = record
Name: string;
SizeX,SizeY: integer;
Enabled: Boolean;
View:boolean;
Index: byte;
ImageFile:string;
end;

type
FileAssemleyImage = record
Name: string;
ButtonIndex:byte;
EditIndex:byte;
Imageindex:byte;
EditObject : array[0..255] of Edit;
FormsObject: forms;
ButtonObject: array[0..255] of Button;
ImageObject :array[0..255] of Image;
end;
var
fil : FileAssemleyImage;
implementation
var
f: file of FileAssemleyImage;{Как исправить эту ошибку}

procedure save;
begin
AssignFile(f, 'c:MyFile.rec');
Rewrite(f);
Write(f, fil);
Closefile(f);
end;
procedure load;
begin
AssignFile(f, 'c:MyFile.rec');
Reset(f);
Read(f, fil);
Closefile(f);
end;

end.

Хотелось бы точно знать из - за чего происходят такии ошибки
Отправлен: 04.04.2007, 13:54
Вопрос задал: Демурин. Н. В (статус: 4-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Демурин. Н. В!
Проблема в том, что у вас в результате вложений в структурах лежат строки непостоянной длинны:
forms = record
Name: string;
SizeX,SizeY: integer;
Enabled: Boolean;
View:boolean;
Index: byte;
Skin:string;
Music:string;
end;

Файл с типизацией как у такой структуры сделать нельзя.
Надо либо писать строки конкертной длинны (string[80]), либо писать свою процедуру чтения и записи этих строк.
---------
Не узнаешь - не попробуешь.
Ответ отправил: Сухомлин Кирилл Владимирович (статус: Специалист)
Ответ отправлен: 04.04.2007, 14:36

Отвечает: Ерёмин Андрей
Здравствуйте, Демурин. Н. В!
Просто замените везде тип данных string на array [1..255] of char; и всё прекрасно откомпилируется. Это связано с тем, что тип данных string по умолчанию не имеет фиксированной длины. Длина меняется в процессе работы программы. Массив из символов даёт ту же самую строку, но его длина определена однозачно и поэтому может быть свободно записана в файл.

Приложение:

---------
Нет правила без исключений. Правило без исключений - исключение из правил.

Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Помощь, советы, обмен опытом.
ICQ: 286867644
----
Ответ отправлен: 04.04.2007, 14:39


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.47 от 06.04.2007
Яндекс Rambler's Top100

В избранное