Что такое код registerclass


Содержание

Register >11.05.2015, 12:29. Просмотров 418. Ответов 2

Вот зачем нужна ссылка, если функция требует указатель?

По идее, ссылка же используется для того чтоб в функции изменять какой то параметр, и поидее сразу в прототипе функции, если уж ей нужна ссылка, то она сразу и пишется(в самом прототипе) и потом уже передаётся просто wcx, без «&», т.к. он автоматически передаёт непосредственно реальный адрес, а не копию.

Т.е. я имею ввиду, что поидее, обычно делается так:

11.05.2015, 12:29

Указатель или ссылка на указатель. В чем разница?
Есть вопрос про указатели и ссылки на указатели :scratch: Хочу в функциях f1() и в f2().

Указатель массива как аргумент функции
Я прочитал несколько алгоритмов сортировки массивов, но не совсем понял, если массив чисел будет.

Аргумент функции — указатель на метод класса
Здравствуйте. Содержание задания — написать программу, создающую копию выбранного пользователем.

Указатель на функцию с аргументами, как аргумент другой функции
У меня есть некая функция, которая принимает как аргумент другую функцию typedef.

Как в аргумент функции передать указатель на метод класса?
Как в аргумент функции передать указатель на метод класса? Метод в классе у меня статический,все.

Что такое код registerclass

В Windows прежде чем создавать окно его нужно зарегистрировать. Именно регистрацию класса окна и производит функция RegisterClass():

lpWndClass — это ссылка на структуру WNDCLASS смотри «Подробности — Структура WNDCLASS». Эта структура описывает основные характеристики окна. После регистрации класса можно вызывать функцию CreateWindow(). При успешной регистрации возвращается ненулевое значение, иначе возвращается ноль. Стандарный пример кода можно привести такой:

В этом коде создается и заполняется структура окна, которая потом передается в функцию регистрации.

Почему это необходимо RegisterClass программирования API с Windows?

Я хотел бы спросить, почему в разработке Windows, графический интерфейс с помощью API, нужно ли зарегистрировать класс окна? Что такое понятие об этом?

Я уже прочитал первые 3 главы программирования Windows , Чарльз Петцольд, но я до сих пор удивляюсь , что это цель явно регистрации класса. Почему я хотел бы сделать это в явном виде? Почему это не делается в фоновом режиме, например , в CreateWindow () функции (или CreateWindowEx ())? Я имею в виду, почему это не код , который RegisterClass () выполняется в CreateWindow (), или почему не CreateWindow () называют RegisterClass () сама по себе?

Я также читал документацию по MSDN и я знаю, что функция RegisterClass () связывает оконную процедуру с классом окна, заполняя структуру WNDCLASS. Я знаю, что это функция, которая обрабатывает сообщения от операционной системы, однако почему необходимо зарегистрировать эту функцию (WinProc один) к классу внутри отдельной функции от CreateWindow ()?

Я могу понять причины существуют функции CreateWindow (), и поэтому он автоматически не показывает окно, созданное. Это означает, я также понимаю, цель функции ShowWindow ().

Я уверен, что там должны быть веские причины для такого поведения, чтобы позволить программисту зарегистрировать класс, когда он хочет, я просто не в состоянии увидеть эти причины, и именно поэтому я прошу вас, ребята, чтобы пролить свет на эту тему.

Пожалуйста, имейте в виду, что я очень новой для разработки графического интерфейса с Windows API. Я сделал некоторые графический интерфейс в среде MATLAB, которая, отличающейся от интерфейса Windows API, еще позволил мне понять некоторые из философии Windows, в частности назначения функций обратного вызова. Я не знаю, если эта информация полезна, но если вам нужно, чтобы сделать какую-то аналогию, пожалуйста, будьте моим гостем.

Так как вы добавили свой вопрос с C ++, я дам вам ++ аналогию C .

RegisterClass в основном вы определения класса и его включения в программу (очень как #include в C ++). WNDPROC Ваш обработчик за все , что происходит внутри окна , если и когда создается экземпляр.

Илон Маск рекомендует:  Asp компонент доступа к базам данных

CreateWindow Концептуально такой же , как вы делаете new в C ++. Вы просите , чтобы Windows , создать новое окно, и вы должны сказать ему тип окна. Окна включают в себя набор предопределенных окон, такие как кнопки или Edit, но если вы хотите создать экземпляр вашего собственного окна , то это нормально, вы просто должны сказать ему , «класс» вы хотели бы создать. Вы уже зарегистрированы этот класс по телефону RegisterClass , так что Windows , теперь можно перейти непосредственно к определению и создать экземпляр окна.

Вы должны RegisterClass определить стиль, порядок окна, то необходимо запрограммировать нить, которой принадлежит окно, чтобы отвечать на сообщения и события и делать что-то или ничего для каждого сообщения о том, что окно принимает и для каждого события, которое происходит, иконка из окна, курсор пользователь видит при наведении курсора на окно, фона клиента окна и меню Windows игровых.

Как вы можете представить себе окно без всех этих свойств?

Может быть, вы спросите, почему все эти свойства окна не являются параметрами функции CreateWindow, поэтому я их с функцией CreateWindow, а не с функцией RegisterClass, верно?

Если все свойства окна являются параметры функции CreateWindow затем CreateWindow функция очень сложна , и линия , которая вызывает CreateWindow правильно это очень долго .

Это делает код очень большой, менее читаемым и менее производительный.

RegisterClass упрощает CreateWindow много.

Это одна из причин того, что Microsoft хочет разработчикам Win32 вызывать RegisterClass первых, прежде чем CreateWindow.

Также предположим , что вы хотите , по крайней мере , два окна с теми же свойствами.

Вы выделить только один экземпляр структуры WNDCLASS, установить свои поля , чтобы установить общие свойства ваших окон и вы вызываете функцию RegisterClass только один раз , но вы вызываете CreateWindow столько раз , сколько нужно , чтобы создать все окна , которые вы хотите, но все с то же имя класса.

RegisterClass не только упрощает и сокращает код много значительно, но она также предотвращает дубликат одного и того же большого кода в CreateWindow.

RegisterClass также делает код более производительным.

Это отличный дизайн первого выделить экземпляр WNDCLASS, установить свои поля, вызовите функцию RegisterClass и затем вызвать функцию CreateWindow столько раз, сколько вы хотите.

Несмотря на то, что вам нужно вызвать RegisterClass несколько раз, если вы хотите окна с различными свойствами, конечно.

Вы также должны изменить экземпляр WNDCLASS перед каждым вызовом функции RegisterClass.

TDelphiBlog


Блог Delphi-программиста. Обзоры инструментов и экспертов для Delphi. Описание JCL, JVCL, cnWizards. Дженерики в Delphi. Дневник разработки Lazy Delphi Builder. Переводы.

Страницы

Motto

В тихом саду здравомыслия
Пусть на вас постоянно падают
кокосовые орехи пробужденности.

вторник, 10 мая 2011 г.

Текучка 13: “шаманский метод Гео” + Register >

Я тут наткнулся на ошибку, появившуюся вследствии использования «Шаманского метода Гео». Уже второй раз натыкаюсь на неё и второй раз удивляюсь тому, откуда она взялась.

Симптомы ошибки

При вызове процедуры RegisterClass для класса появлется исключение EFilerError с текстом ошибки: “A class named XXX already exists”.

Расследование показало что эта ошибка появляется, если RegisterClass был вызван дважды для разных классов с одним и тем же названием.

Казалось бы, причём тут метод Гео?

А вот при том, что именно из-за подмены одного класса другим у меня в коде и возникла ситуация вызвавшая ошибку. В частности, я использую “метод Гео” для подмены стандартного TDbGrid-a своим наследником от TDbGridEh. Для работы моей программы (crm системы) мне необходимо зарегистрировать свой DbGrid. Так что при старте программы я спокойно регистрирую свой класс. А после получаю вышеупомяную ошибку при вызове одного из методов одной из сторонних библиотек, которой также необходимо зарегистрировать класс TDbGrid.

Пример кода вызывающего ошибку:

Пока что решил проблему, написав собственную реализациию вызвавшей проблему функции. А «метод Гео» действительно удобен, и отказываться от него пока не собираюсь.

  • А пока мы тут отлаживаем свои программы %username%, кое-кто их уже написал и отладил. И даже выложил в интернет, чтобы скачать бесплатно новые бесплатные программы могли все желающие.

Что такое код registerclass

Используйте эту функцию, чтобы зарегистрировать классы окна в библиотеку DLL, которая использует MFC.

Указатель на структуру WNDCLASS, содержащий сведения о классе окна, которое необходимо зарегистрировать. Дополнительные сведения об этой структуре см. в разделе Windows SDK.

TRUE, если класс успешно зарегистрирован; в противном случае — значение ЛОЖЬ.

При использовании этой функции, класс автоматически незарегистрированн при выгрузке библиотеки DLL.

В построения DLL, идентификатор AfxRegisterClass определен в качестве макроса, который сопоставляет функции Windows RegisterClass, так как классы, зарегистрированные в приложении автоматически незарегистрированный. При использовании AfxRegisterClass вместо RegisterClass, код может быть использован без изменений и в приложении и в библиотеке DLL.

UnregisterClass

Функция UnregisterClass удаляет класс окна, освобождая память, требуемую классу.

BOOL UnregisterClass (

LPCTSTR lpClassName , // адрес строки с именем класса

HINSTANCE hInstance // дескриптор экземпляра приложения

Параметры

lpClassName — указывает на завершающуюся нулем строку или целый атом. Если значение этого параметра является целым атомом, он должен быть глобальным атомом, созданным предыдущим вызовом функции GlobalAddAtom . Атом, 16-битное значение, меньшее 0 xC 000, должен находиться в младшем слове lpClassName ; старшее слово должно быть равно нулю.

Если значение lpClassName является строкой, она определяет имя класса окна. Это имя класса должно быть зарегистрировано предыдущим вызовом функции RegisterClass . Регистрация системных глобальных классов, таких, как классы элементов управления, не может быть отменена.

hInstance — определяет экземпляр модуля, создавшего класс.

Возвращаемые значения

В случае успеха возвращается ненулевое значение.

В случае если класс не может быть найден или окно, созданное с этим классом, все еще существует, возвращается нуль. Для получения дополнительной информации об ошибке вызовите функцию GetLastError .

Комментарии

Перед вызовом этой функции приложение должно разрушить все окна, созданные с указанным классом.

Регистрация всех классов окон, которые зарегистрировало приложение, должна быть отменена при его завершении.

См. также

GlobalAddAtom, RegisterClass .


Что такое код registerclass

Пытаюсь добавить программно компонент на форму, зная только его имя класса в виде строки, в данном примере «TPanel». (Получаю из SomeObject.ClassName).

Так вот, как мне избавиться от ручного прописывания регистрации классов в блоке инициализации?
Создавать буду только стандартные визуальные компоненты, и вроде прописав строку «Controls» в uses классы должны были автоматом все зарегистрироваться.
Пытался делать так: RegisterClass(FindClass(stClassName));
Но видимо что-то не понимаю.

Илон Маск рекомендует:  плавающие элементы

Может кто покажет и объяснит что да как?

procedure TForm1.Button1Click(Sender: TObject);
var
stClassName: String;
tContClass : TControlClass;
Control: TControl;
begin
st ;
RegisterClass(FindClass(stClassName));
tCont > Control := tContClass.Create(self);
Control.Parent := self;
Control.Name := ‘test’;
Control.Show;
end;

З.Ы.: Что бы наверняка быть уверенным, что класс TPanel присутствует и зарегистрирован, я бросил в дизайнере на форму рядышком еще один TPanel.

Кажется, что registerclass нужен для включения в пакет компонент. То есть, его надо вызывать для самописных компонент в вашем пакете, и излишне делать это для уже зарегистрированных. Вы регистрируете компонент три раза, один раз неявно, два раза явно.Этот код излишен. Контрол скорее всего не отобразится, так как не хватает свойств left, top, width, height или свойств для якорения. Если же у вас в опциях задана загрузка динамических пакетов вместо статической сборки, то в коде не хватает проверки на успешность поиска класса по имени как минимум и нужно также делать loadpackage.

Если не указывать в initiakization регистрацию класса — даёт ошибку, Class TPanel not found.
Если указываю — код работает.

Нужно избавиться от ручного приписывания всех классов компонент которые вздумается создать, при условии что они стандартные и уже включены — Tedit, Tbutton, Tmemo и т.д.

Tpanel отобразится, с 0 позициями и с шириной/высотой по caption, который автоматом берётся из name

ZZ, не ерундите. что мешает писать так: TPanel.Create(Form1);? Зачем регистрировать класс который, как ты сам и заметил, уже зарегистрирован?

Unreg, потому что я не знаю какой компонент я буду добавлять на форму, пока не получу его имя класса в виде строки.

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

ZZ, но по вашему коду такая реакция вполне объяснима.
по шагам:
1. Регистрируете класс TPanel (initialization)
2. задаете строку с именем класса
3. ищите класс и регистрируете его по-новой
4. TControlClass — для меня загадка, может от жизни отстал
5. создаете экземпляр класса-загадки (НЕ TPanel!)

уберите строку RegisterClass(FindClass(stClassName)); и код должен работать. Initialization — всего-лишь секция в которой код выполниться в первую очередь (относительно unit-a)
А вообще к чему такое? Могу предположить, что-то вроде конструктора пишешь?

Это будет сериализация и десериализация объектов по шаблону. С помощью TMemoryStream, методами WriteComponent, ReadComponent.

Т.е. я на форме размещаю TPanel, на него кидаю TLabel, TEdit и прчие контролы. Прописываю им свойства позиционирования, стили и прочее.
Дальше, я хочу плодить N-ое количество таких вот TPanel, меняя свойства Caption и иногда Color.
Шаблон будет преобразовываться в удобочитаемый вид и храниться в текстовом файле, что бы менять его без IDE. Поэтому, я не могу наверняка знать какие классы будут использоваться, что бы прописывать их в initialization.

Клонирование на уровней одного объекта (пустой панели) работает, если не начать пытаться копировать дочерние. Сейчас вот я и пытаюсь сделать это для дочек. Т.к. что бы применить считаные параметры и свойства к объекту, нужно его создать, а что бы создать — нужен указатель (?) на его класс,а указатель на его класс я могу только получив в виде строки, пробежавшись по всем дочерним компонентам и получив ClassName.

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

Если верно то, что без нее не работает, то это указывает на то, что линкер не включает класс tpanel. Значит, надо указать uses extctrls, или динамически загрузить bpl- то есть указать включить класс tpanel в код. Вы утверждаете, что включили tpanel в ресурсы, в таком случае в uses включается нужный модуль. Если не удалить ручками. В таком случае нужно проверить опции компилятора. Очевидно, происходит элиминация кода.

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

Цитата:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;

На форуме в дизайнере бросил TPanel, что бы наверняка знать что данный класс существует и доступен.
Но все равно, без строк в initialization, пишет что Class not found.

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

Что-то как-то по документации получается, что регистрировать необходимо перед поиском:

Classes can be registered with a call to RegisterClasses so that the streaming system will recognize that class in a stream and know how to construct it.

RegisterClasses([TIcon, TBitmap, TButton, TShape, TImage, TMetafile]);

Стоп, стоп. Почему не наследоваться от TComponent. Собрать необходимую панель со всеми примочками, наделить ее своими event-aми, зарегать как подобает, а потом юзать все рид/райты по феншую? Думаю RegisterClass как раз поможет не выходить за пределы приложения, а, (если память не изменяет) RegisterComponent сделает полноценный компонент в палитре. То, что вы пытаетесь сделать этож пиндец как неудобно

Unreg, потому что как по другому я не придумал.
Да и TControl это наследник TComponent.

Если есть другой вариант, объясните поподробней.

Входные данные: ссылка на клонируемый объект — например TPanel с N-ым количеством неизвестных дочерних элементов.
Что нужно получить: его клон, со всеми дочерними элементами.

1. Создать отдельный класс который будет формировать шаблон — не подходит, т.к. ручное задание свойств, редактирование только через IDE.
2. Динамически создавать конкретные объекты — не катит по тем же причинам что и создание нового класса.

ZZ, имхо вариантов нет на вскидку. и твой вариант — не вариант, так как от RegisterClass не уйдешь. Попробуй эксперимент: чистая форма с кнопкой. на onClick вызови FindClass(‘TLabel’) внутри try exception. должна выскочить ошибка типа класс не найден. добавь TLabel на форму и еще раз глянь. Ошибки быть не должно. Когда ты добавляешь компонент на форму из палитры, при создании формы происходит их автоматическая регистрация. Сам проверить не могу, дельфей нет уже года 3.

и кстати тоже интересно. если на чистой форме перед вызовом FindClass сделать RegisterClass(TLabel), а потом попытаться его создать, что будет?

Работает.
Ничего не выводит в случае успеха, выводит TLabel not found при ошибке.

Без RegisterClass выводит ошибку.
Наличие готового TLabel на форме не влияет на работу, так же выдаст ошибку.

Илон Маск рекомендует:  Что такое код swfgradient

TT22, RegisterClass просит TPersistentClass, его возвращает FindClass или GetClass, которому достаточно получить строку.
Но все равно не получается.
Причем при использовании FindClass возвращается ошибка: Class not found;
А при использовании GetClass возвращается ошибка Access violation


ZZ, не ошибка, GetClass возвращает Nil, а FindClass бросает exception- в этом разница.

в общем я бы наверное попытался изменить концепцию. без обращения к методам класса работать не получится,а как привязать это к строковому идентификатору не вижу (

Unreg,
забыл еще сказать. Почему не от TComponent пляшем — потому, что у него нет свойств Name, Left, Top и т.д., изначально он работает с не визуальными компонентами. А вот наследник его TControl — все это имеет.

ZZ, да это не суть. так сразу вспомнить сложновато

ZZ, не все компоненты визуальные. Есть и невизуальные компоненты.

ensen, да. но я клонировать собираюсь только визуальные.

Беда прям какая-то.
Может я изначально не правильно подошел к вопросу клонирования объекта с дочерними объектами?

Идея была такова — рекурсивная функция, которая берет объект, создает его клон, сканирует его потомков, и к каждому потомку применяет саму себя.

Зачем весь этот огород? У TPesistent есть методы чтения и записи в поток для сериализации. Задайте свойство «в текстовом виде» и читайте-пишите на здоровье Зачем нужно криво дублировать реализованный функционал сериализатора?

ensen, не настолько «шарю» в Delphi.
Можете пример показать?

ensen, просто без потомков, панель копирую так

Цитата:
procedure TForm_Alert.Button1Click(Sender: TObject);
var
Tpl, New_comp: TPanel;
Clone:TMemoryStream;
begin
Tpl := PEvent;

Clone := TMemoryStream.Create();
try
Clone.WriteComponent(Tpl);
Tpl.name:=’test’;
Clone.Position := 0;
New_comp := TPanel.Create(self);
Clone.ReadComponent(New_comp);
New_Comp.Top:=New_Comp.Top+100;
New_Comp.Parent := self;
finally
Clone.Free
end;
end;

но хочу обратить внимание, что тут явно указан тип переменной New_Comp.
И что бы считать данные в объект, как я понял, нужно сначала создать этот объект. А без обращение к экземпляру класса (?) это невозможно.

Вот поэтому, зная имя класса объекта которого я копирую, я должен создавать объект того же класса в который копирую.

ZZ, не нужно писать компонент за компонентом. Пишите сразу форму. WriteComponent запишет все дерево owned компонент. Свойства- объекты должны наследовать TPersist, чтобы писаться (как TFont, например). Свойства имеющие и равные default не пишутся.

Соль Дельфи или VCL в том, что IDE обращается к компоненту для генерации кода, а именно- создает поля в TForm, дающие доступ к инстанцированным ReadComponent и делает связку событий. Там есть нюансы, компонент может знать, в режиме конструктора он рисуется (в IDE) или в вашем приложении- иногда это важно.

Что я хочу этим сказать- следующим логичным шагом будет написание кода доступа к компонентам формы, через child, например.

Но,если надо, скажем, хранить в базе туеву *** быстро наваянных форм с компонентами, делающими какую то валидацию, легко навесить event на кнопку сохранить, и тупо делать WriteComponent для формы в базу. Я проверял, введенные значения сохраняются и при чтении вы их увидите и места много не занимают.

Были, может и поддерживаются, интерпретаторы, позволяющие формочковать в этом стиле, один такой входит в бесплатный ibexpert как ibscript, он, кстати, даже помощнее ораклового импортера данных. Он сделан на базе какой то библиотечки, позволяющей рисовать dfm. Это можно сделать и самому, но тут важна кодогенерация.

В чем разница между registerclass и registerclassex?

Кто-нибудь знает разницу между регистрационным классом и registerclassex?

RegisterClass принимает, WNDCLASS и RegisterClassEx принимает WNDCLASSEX .

В документации для WNDCLASSEX говорится:

Структура WNDCLASSEX похожа на структуру WNDCLASS. Есть две отличия. WNDCLASSEX включает элемент cbSize, который определяет размер структуры и член hIconSm, который содержит дескриптор маленького значка, связанного с классом окна.

В документации для RegisterClass говорится:

Функция RegisterClass была заменена функцией RegisterClassEx. Однако вы можете использовать RegisterClass, если вам не нужно устанавливать маленький значок класса.

Я подозреваю, что вы ничего не читали, потому что еще не научились находить документацию. Введите имя функции или типа в поисковую систему, возможно, включая термин MSDN, чтобы сузить результаты и найти документацию из возвращенных обращений.

ios — Разница между register >

У меня есть UICollectionView который показывает 3 разных типа пользовательских ячеек. Каждая ячейка определяется в отдельном xib. Прежде чем я использовал registerClass для регистрации класса ячейки с помощью UICollectionView . Внутри инициализатора ячейки я использовал для загрузки вида из файла nib. При таком подходе было зарегистрировано несколько случайных сбоев, когда он отправился на деактивацию ячейки в cellForItemAtIndexPath и исключение было

Завершение приложения из-за неотображенного исключения «NSInvalidUnarchiveOperationException», причина: «Не удалось создать экземпляр класса с именем (null)»

Чтобы быть точным, выше исключения произошло, когда он попытался загрузить ячейку из наконечника. Теперь я заменил registerClass на registerNib , чтобы зарегистрировать nib файл снова идентификатор ячейки для UICollectionView и удалить код загрузки UICollectionView из инициализатора ячейки. С тех пор выше аварии не сообщалось снова.

Могу ли я узнать, что на самом деле является разницей в методе registerClass и registerNib? UICollectionView наилучший способ указания ячеек для UICollectionView ?

Что такое код registerclass

Registers a class of persistent object so that it’s class type can be retrieved.

Call RegisterClass to register a class with the streaming system. Form classes and component classes that are referenced in a form declaration (instance variables) are automatically registered. Any other classes used by an application must be explicitly registered by calling RegisterClass if instances are to be saved.

Once classes are registered, they can be loaded or saved by the component streaming system. IdentToInt returns nil (Delphi) or NULL (C++) when passed the class name of an unregistered class, and FindClass raises an exception for unregistered classes.

The AClass parameter is the class that is descended from TPersistent. Put the call to RegisterClass in a Register procedure. In Delphi, you can also put the call in the initialization section of the unit in which the class is defined. In C++, the call can also go in the namespace of the compilation unit that defines the class.

If the class is already registered, RegisterClass does nothing. If a different class with the same name is already registered, RegisterClass raises an EFilerError exception.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL