Вопрос № 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.
--------- Не узнаешь - не попробуешь.
НО! Метод 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 ровных квадратиков и выложыли попорядку на стол.
Отвечает: 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.
Отвечает: Базанов Иван Александрович
Здравствуйте, Алексеев Александр Владимирович!
В своих проектах для автоматического обновления я использовал компонент 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 суток с момента отправки ответа. --------- Нет правила без исключений. Правило без исключений - исключение из правил.
Люди помогите с исправлением ошибки в коде
(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.
Хотелось бы точно знать из - за чего происходят такии ошибки
Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Демурин. Н. В!
Проблема в том, что у вас в результате вложений в структурах лежат строки непостоянной длинны: forms = record
Name: string;
SizeX,SizeY: integer;
Enabled: Boolean;
View:boolean;
Index: byte;
Skin:string;
Music:string;
end;
Файл с типизацией как у такой структуры сделать нельзя.
Надо либо писать строки конкертной длинны (string[80]), либо писать свою процедуру чтения и записи этих строк.
--------- Не узнаешь - не попробуешь.
Отвечает: Ерёмин Андрей
Здравствуйте, Демурин. Н. В!
Просто замените везде тип данных string на array [1..255] of char; и всё прекрасно откомпилируется. Это связано с тем, что тип данных string по умолчанию не имеет фиксированной длины. Длина меняется в процессе работы программы. Массив из символов даёт ту же самую строку, но его длина определена однозачно и поэтому может быть свободно записана в файл.
Приложение:
--------- Нет правила без исключений. Правило без исключений - исключение из правил.