Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 21.08.2011
Сообщений: 5

Класс TParser

21.08.2011, 14:58. Показов 3859. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, наткнулась на статью о классе TParser:
Недокументированный класс TParser
Но при попытке использовать у себя:
C++
1
2
TFileStream *FS = new TFileStream("YourFile.xxx", fmOpenRead);
TParser *Par = new TParser(FS);
получила ошибку:" Could not find a match for 'TParser::TParser(TFileStream*)' "

Вроде бы TParser должен читать с TFileStream? В чем же дело?
В общем как причины появления ошибки, так и методы избавления от неё и перспективы дальнейшего использования этого класса для меня во мраке...

Буду благодарна за любые объяснения или стоящие ссыли по теме
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.08.2011, 14:58
Ответы с готовыми решениями:

TParser
Неужели в C++ Builder 2007 нельзя использовать парсер математических выражений, как это описано вот тут: ...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
На самом деле ничё фантастического я не прошу, ведь: template <class T> class matrix { friend class diagonal; ...

Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами
Здравствуйте! Никак не могу продумать структуру этой программы. Проходим наследование, но я все равно не знаю, как его здесь применить. Как...

9
Покинул форум
3189 / 1368 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
21.08.2011, 21:54
Diligent, хм... у меня пример работает - C++ Builder 6. А у Вас какой Билдер?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.08.2011, 01:12
RAD XE, не работает, не может найти соответствие.

Добавлено через 1 час 9 минут
Неплохая статься на тему : TParser - недокументированный класс для парсинга , но - не работает ...
1
0 / 0 / 0
Регистрация: 21.08.2011
Сообщений: 5
22.08.2011, 07:23  [ТС]
Вот и у меня RAD XE
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.08.2011, 07:41
ошибку
[BCC32 Error] : E2285 Could not find a match for 'TEdit::TEdit()'
вызовет, например,
C++
1
TEdit *edit = new TEdit();
, но здесь это решается указанием владельца:
C++
1
TEdit *edit = new TEdit(this); // или Form1, или Application
, а потом ему чем не угодил ...
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
22.08.2011, 08:59
Лучший ответ Сообщение было отмечено как решение

Решение

Специальный пример для XE:

Будем парсить входной файл test.txt вот с таким содержанием:
Code
1
2
3
4
5
6
7
8
9
object Memo1: TMemo
  Left = 8
  Top = 8
  Width = 305
  Height = 379
  Lines.Strings = (
    'Memo1')
  TabOrder = 0
end

Собственно код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// .hpp
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TMemo *Memo1;
    void __fastcall FormClick(TObject *Sender);
private:    // User declarations
 
 
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
        // для XE необходимо прописать эту функцию  
    void __fastcall OnParserErrorEvent(System::TObject* Sender, 
                         const System::UnicodeString Message, bool &Handled);
 
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// .cpp
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
 
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::OnParserErrorEvent(System::TObject* Sender,
    const System::UnicodeString Message, bool &Handled) {
    ShowMessage("Parser error <" + Message + ">!");
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClick(TObject *Sender) {
    TFileStream *FS = new TFileStream("c:\\Test.txt", fmOpenRead);
    TParser *Par = new TParser(FS, OnParserErrorEvent);
    do {
        // получаем лексему
        const AnsiString StringValue = Par->TokenString();
        // получаем ее позицию в потоке
        const int Pos = Par->SourcePos();
        // получаем номер строки
        const int Line = Par->SourceLine;
        // получаем тип лексемы
        const char TokenType = Par->Token;
        switch (TokenType) {
        case toSymbol:
            Memo1->Lines->Add(StringValue + " символ в строке: " + Line +
                " позиция: " + Pos);
            break;
        case toInteger:
            Memo1->Lines->Add(StringValue + " целое в строке: " + Line +
                " позиция: " + Pos);
            break;
        case toFloat:
            Memo1->Lines->Add(StringValue + " вещественное в строке: " + Line +
                " позиция: " + Pos);
            break;
        case toString:
            Memo1->Lines->Add(StringValue + " строка в строке: " + Line +
                " позиция: " + Pos);
            break;
        }
 
    }
    while (Par->NextToken() != toEOF);
 
    delete Par;
    delete FS;
}
Результат:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
object символ в строке: 1 позиция: 0
Memo1 символ в строке: 1 позиция: 7
TMemo символ в строке: 1 позиция: 14
Left символ в строке: 2 позиция: 23
8 целое в строке: 2 позиция: 30
Top символ в строке: 3 позиция: 35
8 целое в строке: 3 позиция: 41
Width символ в строке: 4 позиция: 46
305 целое в строке: 4 позиция: 54
Height символ в строке: 5 позиция: 61
379 целое в строке: 5 позиция: 70
Lines символ в строке: 6 позиция: 77
Strings символ в строке: 6 позиция: 83
Memo1 строка в строке: 7 позиция: 100
TabOrder символ в строке: 8 позиция: 112
0 целое в строке: 8 позиция: 123
end символ в строке: 9 позиция: 126
6
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.08.2011, 10:16
а пацелавать ? ... пардон ... а объяснить , почему не работало в РАДХЕ ...
0
0 / 0 / 0
Регистрация: 21.08.2011
Сообщений: 5
22.08.2011, 10:59  [ТС]
А буквы кириллицы он тоже за разделитель лексем считает.. Нехорошо..
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
22.08.2011, 18:20
Цитата Сообщение от LK Посмотреть сообщение
почему не работало в РАДХЕ
В RAD XE вторым параметром надо передавать функцию с параметрами, как указано в примере.
Это - CALLBACK при возникновении ошибки при парсинге. В этой функции вы получаете сообщение об ошибке,
и решаете, обрабатывать ошибку или нет - параметр Handled.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
23.08.2011, 22:03
угу, нашел уже:
c:\Program Files\Embarcadero\RAD Studio\8.0\include\windows\rtl\Classes.h pp
C++
1
2
3
4
5
typedef void __fastcall (
             __closure *TParserErrorEvent)(
             System::TObject* Sender,
             const System::UnicodeString Message,
             bool &Handled);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.08.2011, 22:03
Помогаю со студенческими работами здесь

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не знаю как решить... Разработать абстрактный класс класс...

Отдельно класс данных, класс формул и главный класс
Здравствуйте! У меня есть три вопроса. Первый вопрос. Скажите пожалуйста! Правильный ли это подход к созданию приложений :...

Создать класс колесо, имеющее радиус. Определить конструкторы. Создать класс машин, содержащий класс колесо
Создать класс колесо, имеющее радиус. Определить конструкторы. Создать класс машин, содержащий класс колесо. Дополнительно есть марка,...

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число"
Ткма работы создать класс pair (пара чисел); определить метод перемножения полей и операцию сложения пар (a,b)+(c,d) =(a+b,c+d)...

Класс, производный класс, паблик-класс
Задание: Создать класс колесо, которое имеет радиус. Определить конструкторы и метод доступа. Создать класс машин, содержащий класс колесо....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru