Перейти к содержанию

Работа с данными сгенерированной формы


MasterGH

Рекомендуемые сообщения

Для версии CE 6.2

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

Я понятия не имею как это сделать или очень смутно помню, но я знаю, "что сделать чтобы узнать как это сделать". Чтобы дать правильный ответ нужно попробовать несколько вариантов решения на практике. Об этом будет большой текст под спойлером.

Желаю приятного программирования CE Lua

P.S. Править и форматировать текст должным образом нет времени.

1. В дизайнере форм я создал форму по умолчанию и бросил компонент ввода текста CEEdit

Обращаем внимание на имя компонента формы UDF1 и тип формы - TCEForm.

Компонент ввода текста, имя CEEdit1 и тип TCEEdit

Можно менять имена на свои, но названия типов менять нельзя. Названия типов зашиты уже в CE.

2. У CEEdit1 в тексте написать что-нибудь. Например "4345345"

3. Теперь можно закрыть дизайнер форм и открыть луа консоль из CE, и лезем в main.lua . Видим почти две тысячи мелких строк на иностранном языке. Как же во всем этом разобраться?

Во всем этом разбираться сейчас не нужно. Цель - у компонента прочитать текст.

Из программирования понятно чтобы работать с компонентом или прочитать текст, нужно найти тип компонента, а именно TCEEdit. Но можно увидеть только Edit Class. Что это? Не соответствие с документацией, ошибка или ещё что-то? Ладно, будем считатать что Edit Class это и есть тип TCEEdit.

Но, если посмотреть, тут ничего нет чтобы прочитать текст в переменную или обратно записать.


createEdit(owner): Creates an Edit class object which belongs to the given owner. Owner can be any object inherited from WinControl

properties
Text: string - The current contents of the editfield
OnChange: function - The function to call when the editfield is changed

methods
clear()
selectAll()
clearSelection()
copyToClipboard()
cutToClipboard()
pasteFromClipboard()
onChange(function)
Edit Class: (Inheritance: WinControl->Control->Component->Object)

Опять немного вернёмся к цели. Наша задача прочитать текст, изменить его и опять прочитать. Читать можно выводя на консоль через многим известную функцию Print([перменная])

Что же дальше? Смотрим на это "(Inheritance: WinControl->Control->Component->Object"

Это означает наследование функций этих классов. Среди функций этих классов может быть метод чтения и записи. Итак смотрим


WinControl Class: (Inheritance: Control->Component->Object)
properties
DoubleBuffered: boolean - Graphical updates will go to a offscreen bitmap which will then be shown on the screen instead of directly to the screen. May reduce flickering
ControlCount : integer - The number of child controls of this wincontrol
Control[] : Control - Array to access a child control
OnEnter : function - Function to be called when the WinControl gains focus
OnExit : function - Function to be called when the WinControl loses focus


methods
getControlCount() Returns the number of Controls attached to this class
getControl(index) : Returns a WinControl class object
getControlAtPos(x,y): Gets the control at the given x,y position relative to the wincontrol's position
canFocus(): returns true if the object can be focused
focused(): returns boolean true when focused
setFocus(): tries to set keyboard focus the object
setShape(Region): Sets the region object as the new shape for this wincontrol
setShape(Bitmap):
setOnEnter(function) : Sets an onEnter event. (Triggered on focus enter)
getOnEnter()
setOnExit(function) : Sets an onExit event. (Triggered on lost focus)
getOnExit()

Ничего тут нет. Берём следующий класс и находим

Control Class: (Inheritance: Component->Object)

properties:

Caption: string - The text of a control

Top : integer - The x position

Left : integer - The y position

Width : integer - The width of the control

Height : integer - The height of the control

Align: AlignmentOption - Alignment of the control

Enabled: boolean - Determines if the object is usable or greyed out

Visible: boolean - Determines if the object is visible or not

Color: ColorDefinition/RGBInteger - The color of the object. Does not affect the caption

Parent: WinControl - The owner of this control

PopupMenu: PopupMenu - The popup menu that shows when rightclicking the control

Font: Font - The font class associated with the control

OnClick: function - The function to call when a button is pressed

methods:

getLeft()

setLeft(integer)

getTop()

setTop(integer)

getWidth()

setWidth(integer)

getHeight()

setHeight()

setCaption(caption) : sets the text on a control. All the gui objects fall in this category

getCaption() : Returns the text of the control

setPosition(x,y): sets the x and y position of the object base don the top left position (relative to the client array of the owner object)

getPosition(): returns the x and y position of the object (relative to the client array of the owner object)

setSize(width,height) : Sets the width and height of the control

getSize() : Gets the size of the control

setAlign(alignmentoption): sets the alignment of the control

getAlign(alignmentoption): gets the alignment of the control

getEnabled() : gets the enabled state of the control

setEnabled(boolean) : Sets the enabled state of the control

getVisible() : gets the visible state of the control

setVisible(boolean) : sets the visible state of the control

getColor() : gets the color

setColor(rgb) : Sets the color

getParent() : Returns nil or an object that inherits from the Wincontrol class

setParent(wincontrol) : Sets the parent for this control

getPopupMenu()

setPopupMenu()

getFont(): Returns the Font object of this object

setFont(): Assigns a new font object. (Not recommended to use. Change the font object that's already there if you wish to change fonts)

repaint(): Invalidates the graphical area of the control and forces and update

setOnClick(functionnameorstring) : Sets the onclick routine

getOnClick(): Gets the onclick function

doClick(): Executes the current function under onClick

Ну, нашли и что делать дальше?

Если бы читатель лазил по форму Cheat Engine, то помнил бы такую фичу. Обращение к переменным и классам через знак "_". В противном случае пришлось бы копаться в main.lua чтобы искать форму и поля ввода через цикл используя функции поиска типов и имен. Пока не будем этим заниматься.

4. Итак что дано:

4.1) Имена и названия типов компонентов: имя компонента формы UDF1 и тип формы - TCEForm, для компонента ввода текста имя CEEdit1 и тип TCEEdit

4.2) Наследование Edit Class: (Inheritance: WinControl->Control->Component->Object)

4.3) Методы класса Control

setCaption(caption) : sets the text on a control. All the gui objects fall in this category

getCaption() : Returns the text of the control

4.4) Обращение к переменным и классам чререз знак "_".

4.5) Функция вывода ниформации на консоль Print()

4.6) Если вариант со знаком "_" не прокатит, то полезем в main.lua за функциями поиска компонетов через типы и имена.

Осталось все соединить во едино.

5) Пишем в Lua консоли Print("Hello World")

Не работает.

Пишем print('Hello World'), опять не работает.

Пишем print('Hello World'). Заработало. Вот так в Lua важно соблюдать правила использования функции print

Пишем

someText = "Hello World"

print(someText)

Далее будет готовый ответ чтобы не утомлять читателя в угадывании синтаксиса CE Lua кода. Чтобы получить текст формы мы должны написать это:

someText = control_getCaption(UDF1_CEEdit1)

print(someText)

Обращаем внимание на то control нужно писать с маленькой буквы, хотя в документации этот класс с большой буквы.

По аналогии пишем, а потом читаем

control_setCaption(UDF1_CEEdit1, ("aaaa"))

someText = control_getCaption(UDF1_CEEdit1)

print(someText)

В консоли я увидел ответы:


print(someText)

4345345
control_setCaption(UDF1_CEEdit1, ("aaaa"))
someText = control_getCaption(UDF1_CEEdit1)
print(someText)

aaaa
someText = control_getCaption(UDF1_CEEdit1)

Ну и на форму посмотрим, теперь там находится текст не "4345345", а "aaaa"

Выводы:

1) Знать все чтобы сделать какие-то вещи невозможно даже имея под рукой main.lua. Документация main.lua это даже не документация, а так, справочник опытных пользователей. По идее на CE Вики должно быть когда-нибудь подробное описание, но пока его нет. Многие вещи приходится либо подбирать, угадывать или искать в поисковиках. Приходится лазить по форму CE, искать примеры и запоминать их. В самых тяжелых случаях можно задать вопрос на форуме у нас или на форуме CE, для опытных можно посмотреть исходники с SVN CE о том как работают Lua функции. Ссылка на исходники есть на официальном сайте.

2) CE программа довольно сырая, поэтому если что-то очевидно работающее в ней не работает, то потому что есть ошибки и не доделки. Спрашивайте на форуме CE.

3) В main.lua стоит посмотреть все классы и пробежаться по функциям, возможно каждый найдёт для себя что-то интересное. Например при работе как с компонентами форм трейнера, так и создание расширения функционала Cheat Engine, рисование в окне игры, работа с отладчиком, реакции на горячие клавиши, составления АА-скриптов и многие другие интересные идеи которые могут придти в голову.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.