Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2007, 21:16   #1
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
Восклицание Теоритические вопросы

Cобственно, тут вопросов немного. Они по большей части действительно теоритические. Я буду очень благодарен всем кто откликнется.
P.s Извините за корявое описание. Оно иногда имеет место быть...

1. чем отличаются свойства компонентов items и lines (если брать например memo и listbox)
(я имею ввиду почему назвали items хотя они имеют те же свойства что и lines)
2. При динамическом созданни кнопки(with tbutton.create(self)) мы указываем что хотим создавать себя
(буквальный перевод self). А есть ли какие-либо другие параметры отвечающие требованию
AOwner:TComponent и если есть то какие?
4. Можно как нибудь динамически изменять стиль закрашиваемой линий-я имею ввиду нарисовал
элипс\прямоугольник, нажал на него- выбрал пунктир-линия стала пунктирной. Может это реализовать
как нибудь с помощью собственно напсанной процедуры? Просто не приходит в голову как это реализовать.
5. А что из себя представляют ini и dat файлы? Так как класс tinifile пошел от tobject то можно ли там
хранить описания компонентов или их самих(типа with tbutton.create do begin ...)
6. один ворос посвящееный 3ds max и delphi. Вот часто пишут: движок поддерживает фотореалистичную воду
или её создание(ну что то типа этого). То есть получается движок создает эту фотореалитичную воду там
где надо программисту. А для чего тогда её создание в 3ds max(или других 3д редакторах)? тое сть получается что я могу только
создать берега и потом сделать воду с помощью движка. Я просто немного не понимаю этот процесс. Если я ошибся то поравьте меня.
7. А можно как нибудь запихнуть в процедуру (её потом в dll) код чтения из файла или его открытия. Типа if
opendialog1.execute (открыт) then .... или assignfile(f,'c\programmers.txt') далее reset(f) ... ?
8. Тут такая проблемка. Был код который успешно работал:
for i:=length(s) downto 1 do
if (s[i]=c) and(q<1) then begin q:=q+1; e:=i;end;
delete(s,1,e);
Я его запихнул в функцию а её в dll файл. Но после этого пошли странные ошибки. Может это
ошибки компилятора, а может мои. Я просто не понимаю в чем проблема.
сам dll файл:
////////////////////////////////////////////////////////////
library Project1;
uses
SysUtils,Classes;
function formcaption1 (sy:string):string;stdcall;
var e,i,q:integer;c:char;df:string;
begin
q:=0;c:='\';e:=0; df:=sy;
for i:=length(df) downto 1 do
if (df[i]=c) and(q<1) then begin q:=q+1; e:=i;end;
delete(df,1,e);
result:=df;
end;
exports formcaption1 index 13;
{$R *.res}
begin
end.
//////////////////////////////////////////////////////////////////
а теперь ошибка(дословно):
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\
Project 'project.exe' raised exception class eaccessviolation with message 'access violation at adress 00401cae in
module 'project.exe' write of adress 676e6y74. Process stopped. use step or run continue.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\
Кстати, в самом dll файле делфи сообщала что типа shellctrls находится на платформе(to platform).
9. Фленов описывает dll файлы как модальные или немодальные. По нему получается что прога не может
узнать где конец программы(формы запихнутой в dll файл-модальное окно) и поэтому не освобождает память. Но с другой стороны
он же сам писал form1.showmodal а потом по оканчанию form1.free.Но получается что это free никогда не
выполняется т.к прога не узнает что мы закрыли эту форму. Да и вообще почему эти окна(модальное и немодальное)
так называются. Я просто большой разницы не вижу между ними. Мы ведь писали потом просто другую процедуру
которая также освобождала память. К тому же те примеры которые он привел к немодальным окнам плохо работают.
То ограничение if f>0 then ....Free не работает хоть я присваиваю form1.oncreate f:=0; переменой ф значение 0.
Я посмотрел и его иходники. Там такая же ошибка. Халтурит Фленов, однако....
10. А как делать описания типов файла(сделать новый формат-например типа jpeg)? Я просто мне надо сделать а никогда в жизни с этим не встречался. Это нужно для мого компонента на базе timage. Там должен быть и gif. jpeg 2000 и.т.д. Я уже перерыл все существуюшщие у меня книги, но инфы как это делать нет. Я был бы благодарен за хоть какой-нибудь простой пример описания(точнее создания нового формата-любого).

Последний раз редактировалось bill; 22.06.2007 в 21:30.
bill вне форума Ответить с цитированием
Старый 23.06.2007, 13:53   #2
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от bill Посмотреть сообщение
1. чем отличаются свойства компонентов items и lines (если брать например memo и listbox) (я имею ввиду почему назвали items хотя они имеют те же свойства что и lines)
Ничем не отличаются, кроме названия. Memo - текстовый редактор и ему присущи строки символов (т.е. lines), а в listbox - список - хранит элементы (т.е. items)

Цитата:
Сообщение от bill Посмотреть сообщение
2. При динамическом созданни кнопки(with tbutton.create(self)) мы указываем что хотим создавать себя (буквальный перевод self). А есть ли какие-либо другие параметры отвечающие требованию
AOwner:TComponent и если есть то какие?
Self означает совсем не то, что хотят создать "себя". В данном случае указывается что владельцем кнопки является форма, т.е. можно было-бы написать tbutton.create(Form1), но т.к. название формы может меняться, то обычно используется неявный параметр формы Self - указатель на эту форму. У кнопки (да и любого объекта) тоже есть такой указатель.
Если создается сама форма то в качестве владельца указывается экземпляр приложения, т.е. Application который создается автоматически: MyForm := TForm.Create(Application);
Jeni вне форума Ответить с цитированием
Старый 23.06.2007, 14:20   #3
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от bill Посмотреть сообщение
4. Можно как нибудь динамически изменять стиль закрашиваемой линий-я имею ввиду нарисовал элипс\прямоугольник, нажал на него- выбрал пунктир-линия стала пунктирной. Может это реализовать
как нибудь с помощью собственно напсанной процедуры? Просто не приходит в голову как это реализовать.
Лучше все это реализовать с помощь контекстных меню (TPopupMenu), где в пунктах меню указать конкретные стили. Вот только придется как-то "помнить" где какие фигуры рисовались. А изменить сам стиль легко - просто заново нарисовать фигуру с этим стилем (возможно придется запоминать и перерисовывать "фон", т.е. те фигуры, что лежат "ниже").

Цитата:
Сообщение от bill Посмотреть сообщение
5. А что из себя представляют ini и dat файлы? Так как класс tinifile пошел от tobject то можно ли там хранить описания компонентов или их самих(типа with tbutton.create do begin ...)
Что из себя представляют dat-файлы зависит от их наполнения, иногда такое расширение имеют фильмы - это чисто двоичные файлы. А вообще-то нет никаких строгих стандартов на расширения файлов, можно любой "обозвать" по-разному, например, можно дать текстовому файлу расширение exe и он от этого не станет "менее текстовым", просто возникнут небольшие затруднения с его прочтением.
Ini-файлы (в "классическом" виде) - обычные текстовые файлы, имеют определенную структуру (секции/параметры/значения). Хранить в них можно что угодно, в том числе и свойства/описания компонентов. Например, для каждого компонента создать секцию с именем этого компонента, а для каждого свойства - отдельный параметр.

Цитата:
Сообщение от bill Посмотреть сообщение
7. А можно как нибудь запихнуть в процедуру (её потом в dll) код чтения из файла или его открытия. Типа if opendialog1.execute (открыт) then .... или assignfile(f,'c\programmers.txt') далее reset(f) ... ?
В dll можно размещать не только это, но и целые формы со всеми нужными элементами.
Jeni вне форума Ответить с цитированием
Старый 23.06.2007, 15:49   #4
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от bill Посмотреть сообщение
8. Тут такая проблемка. Был код который успешно работал...
сам dll файл...
function formcaption1 (sy:string):string;stdcall;...
Чтобы библиотека нормально работала с передаваемыми строками, необходимо и в программе и в библиотеке в раздел uses добавить модуль ShareMem, причем этот модуль должен быть первым по списку!

Цитата:
Сообщение от bill Посмотреть сообщение
Кстати, в самом dll файле делфи сообщала что типа shellctrls находится на платформе(to platform).
Это сообщение означает не "на платформе", а то, что компоненты/подпрограммы зависят от платформы (Win32, Linux, .NET) и не смогут быть использованы при переносе на другую платформу. Эти предупреждения можно отключить в настройках проекта

Цитата:
Сообщение от bill Посмотреть сообщение
9. Фленов описывает dll файлы как модальные или немодальные. По нему получается что прога не может узнать где конец программы(формы запихнутой в dll файл-модальное окно) и поэтому не освобождает память. Но с другой стороны
он же сам писал form1.showmodal а потом по оканчанию form1.free.Но получается что это free никогда не выполняется т.к прога не узнает что мы закрыли эту форму. Да и вообще почему эти окна(модальное и немодальное) так называются. Я просто большой разницы не вижу между ними. Мы ведь писали потом просто другую процедуру
которая также освобождала память. К тому же те примеры которые он привел к немодальным окнам плохо работают.
То ограничение if f>0 then ....Free не работает хоть я присваиваю form1.oncreate f:=0; переменой ф значение 0.
Я посмотрел и его иходники. Там такая же ошибка. Халтурит Фленов, однако...
1. Модальных/немодальных dll-файлов не бывает (опечатка?). Наверное, имелись в виду окна?

2. Разница между модальным и немодальным окном в том, что модальное окно не дает работать с другими окнами (в рамках одной программы), т.е. пока его не закроешь, другие окна недоступны (для пользователя). А обычное (немодальное) окно позволяет переключаться на любые другие окна. Иногда все это имеет очень важное значение. Например диалоговые окна практически всегда делают модальными.
Представь, что диалог немодальный - пользователь открыл это окно, затем случайно щелкнул по главной форме, программа переключилась на нее, диалог остался "висеть" за главным окном, его не видно, пользователь растерян (куда делось окно?) и даже его повторный вызов (скажем из меню) может ничего не дать - оно и так открыто, просто осталось невидимо. Еще хуже, если такое окно создается динамически - первое еще не уничтожилось, а пользователь запустил второе (третье...), а ведь все эти диалоги будут пытаться работать с одними и теми же данными и изменять их (в произвольные моменты). С модальным таких проблем не возникнет - пока не закроешь, не вернешься назад и с программной точки зрения легче.
Код:
procedure xxxx;
begin
  // Предварительная настройка
  <оператор1>

  // Модальное окно
  DialogForm.ShowModal;

  // Проверка результата
  // Пока DialogForm не закроется второй оператор не выполнится
  <оператор2>
end;
Неужели было бы легче написать DialogForm.Show (немодально), а потом ловить по всему коду момент его закрытия, чтобы проверить результат?

3. Халтурит Фленов или нет - еще неизвестно. Это может быть и добросовестное заблуждение и случайная опечатка и ошибка наборщика в типографии. Тем более не приведено никакого конкретного кода.

4. Много я здесь просто не понял. Например, "прога не может узнать где конец программы(формы запихнутой в dll файл-модальное окно)" - не разобрал эту фразу.
Jeni вне форума Ответить с цитированием
Старый 23.06.2007, 20:18   #5
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
Радость

1. Да, Jeni , это была дейтсвительно опечатка.
2. Про формы я знаю. Я просто в dll никогда не запихивал именно процедуры открытия файлов.
3. Код Фленова предоставил. Во-первых этот "неработающий код" один и тот же и в книге и на диске.
Но даже несмория на такой промах я считаю книгу фленова одной из лучших книг про программированию.
С этим многие могут не согласиться, но это мое мнение.
4. А почему модуль ShareMem должен быть первым по списку а не вторым хотя бы? Я понимаю что он не
может быть на последнем месте, но все-таки?
5. Jeni, огромное спасибо!!!! Извини за корявые описания. Просто когда меня перполняют чувства,эмоции,
мысли и всё и вся я могу иногда выдавать подобные фразы. Я конечно каждый свой текст читаю не 1 раз на проверку таких вот выражений, но иногда они проскакивают.
Я все таки расшифрую фразу: " прога не может узнать где конец программы(формы запихнутой в dll файл-модальное окно)" .
Основной здесь смысл стоит в - прога не может узнать где конец программы. А в скобках идет пояснение-
форма запихнута в dll файл-модальное окно.

Последний раз редактировалось bill; 07.10.2007 в 12:39.
bill вне форума Ответить с цитированием
Старый 23.06.2007, 23:35   #6
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от bill Посмотреть сообщение

2. Про формы я знаю. Я просто в dll никогда не запихивал именно процедуры открытия файлов.
4. А почему модуль ShareMem должен быть первым по списку а не вторым хотя бы? Я понимаю что он не может быть на последнем месте, но все-таки?
5. Я все таки расшифрую фразу: " прога не может узнать где конец программы(формы запихнутой в dll файл-модальное окно)" .
Основной здесь смысл стоит в - прога не может узнать где конец программы. А в скобках идет пояснение-форма запихнута в dll файл-модальное окно.
Отвечаю на то, что знаю.
2. С точки зрения системы нет особой разницы, где выполняется код - в библиотеке или в "нормальной" программе. Есть ньюансы в обработке ошибок, но, в целом, можно использовать любой код и там и там.
4. Как минимум это гарантирует, что в других модулях строки не начнут использоваться раньше, чем пройдет инициализация в модуле ShareMem (вероятно там как-то модифицируется менеджер управления строками).
5. Если честно - я так и не понял "пояснений" (в пояснении написано то же самое, что я не понял!).
Jeni вне форума Ответить с цитированием
Старый 24.06.2007, 22:57   #7
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
Радость

прога не может узнать где конец программы. А дальше я пишу что другая форма(мы говорили про формы модальные\немодальные использующиеся в программе) которая
запихнута в dll файл - это модальное окно.
Поэтому итог: прога использует модальное окно(ту форму которая как раз у меня нахожится в dll файле). Вот это я примерно и пытался описать, не знаю конечно, как это у меня получилось...
P.s Надеюсь у меня с русским все ХАРАШО!!!
bill вне форума Ответить с цитированием
Старый 25.06.2007, 13:10   #8
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

С русским всё нормально, а вот с объяснениями... Постараюсь объяснить что я не понял в "объяснении".
Вот например фраза: "прога не может узнать где конец программы".
1. Какой программы: самой себя? Или библиотеки?
2. Что значит "конец"? Не может узнать конечный адрес программы (где, кстати, в памяти, на диске)? Или не может отследить факт завершения программы? Или еще что-то?

Первоначальная фраза "прога не может узнать где конец программы (формы запихнутой в dll файл-модальное окно)" ничем не лучше.
Здесь понятие программы и формы используется как синонимы, а ведь это совершенно разные понятия, с технической точки зрения не имеющие ничего общего.

Возможно (но это уже мои домыслы) имелось ввиду, что программа не может отследить факт закрытия формы, вызванной из библиотеки. Или, что программа не может освободить эту форму (через Free). Если так - то это уже совсем другая песня.
Jeni вне форума Ответить с цитированием
Старый 25.06.2007, 18:50   #9
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию

1. Да, самой себя.
2. Да, факт завершения программы.
Вы правы, с этим дейтвительно возникают иногда проблемы.
bill вне форума Ответить с цитированием
Старый 26.06.2007, 12:10   #10
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию

1. Jeni, нет, все таки, не работает у эта функция, которую я запихнул в dll файл, даже с подключением модуля ShareMem.
Вот эти проги. В новая папка2 -сама программа. В function and procedure сама библиотека.
Прога выдает ошибку:Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation '. Process stopped
Use Step or Run continue.
2. Я хочу делать новый компонент на базе image-а. Там он будет сможет открывать и gif-анимацию и файлы фотошопа. Но проблема в том что я никогда не описыва новые форматы. Мне это сделаьб также как описание типа или нет? И еще. Откуда можно взять инфу о самом типе(например надо описать формат gif - а как?Мне как раз нужна инфа о том что он из себя представляет).
Заранее благодарен за ответ.

Последний раз редактировалось bill; 07.10.2007 в 12:39.
bill вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросы по реестру Titan123 Общие вопросы Delphi 5 02.07.2008 13:44
Простые вопросы по C++ ERASERROR Помощь студентам 3 24.03.2008 16:58
Вопросы по WEB Elm0 Свободное общение 12 20.02.2008 02:40
вопросы MAcK Win Api 7 21.07.2007 18:08