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

Использование memo как консоли

14.01.2012, 00:12. Показов 3904. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Други мои - выручайте.

Есть программа на Java (запускается батником), которая выводит все свои сообщения в консоль. Плюс управляется оттуда, вводом команд.

Давно-давно я видел программу на бейсике, где в качестве окна консоли использовался Memo, а полем ввода команд был edit. Отсюда вопрос - могу ли я сделать нечто подобное на C++? Просто это дуратское консольное окно не отображает часть символов и не даёт их вводить, та и мне было бы намного удобнее работать не с консолью, а с GUI приложением.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2012, 00:12
Ответы с готовыми решениями:

Из консоли в Memo
Нужно вывести результат выполнения консольной команды, например ipconfig допустим в Memo. Можно...

Вывод из консоли в Memo-поле
Извините, что слишком часто задаю вопросы, но, думаю, это поможет не только мне. Запускается...

Вывести текст с консоли в Memo, но только после завершения консольного приложения
Программа выводить текст с консоли в Memo, но только после завершения консольного приложения. Как...

Вывод из консоли в memo
Как вывести текст из консоли в memo? Т.е. у меня с формы по нажатию кнопки запускается консольное...

8
wtf!?
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
14.01.2012, 17:07 3
как по мне, так нужно копать в сторону пайпов
0
3 / 3 / 0
Регистрация: 10.07.2009
Сообщений: 101
14.01.2012, 20:44  [ТС] 4
Спасибо конечно, но тут не совсем то, что нужно. Если использовать эти методы, то консольное окно всё равно останется, та и данные идущие в него извне, даже с кодировкой utf-8, в итоге выводятся иероглифами (я уже по-экспериментировал).

Хм, а есть ли извращенцы, которые писали свои аналоги cmd.exe? Мб есть какие-то сорсы, из которых можно выковырять обработчик...
0
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
15.01.2012, 15:01 5
Лучший ответ Сообщение было отмечено как решение

Решение

Oskaria, вот набросал тебе приложение.
В общем, форма, на ней два мемо. В нижнее мемо вводим текст как в командной строке,
в верхнее мемо выводится вывод
Миниатюры
Использование memo как консоли   Использование memo как консоли   Использование memo как консоли  

Использование memo как консоли  
3
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
15.01.2012, 15:01 6
Лучший ответ Сообщение было отмечено как решение

Решение

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
//---------------------------------------------------------------------------
 
#ifndef Dos2MemoH
#define Dos2MemoH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TMemo *MemoOutput;
    TLabel *Label1;
    TLabel *Label2;
    TMemo *MemoInput;
    TSplitter *Splitter1;
    void __fastcall MemoInputKeyPress(TObject *Sender, wchar_t &Key);
private:    // User declarations
    void Dos2MemoF(const AnsiString &sCommandLine);
 
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// ---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
// ---------------------------------------------------------------------------
// standard
#include <memory>
#include <string>
#include <iostream>
#include <istream>
// vcl
#include <IOUtils.hpp>
#include <StrUtils.hpp>
// header
#include "Dos2Memo.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}
 
// ---------------------------------------------------------------------------
void AddOemLine(TStrings *AStrings, std::ifstream & /* out */ ifile) {
    std::string sLine = "";
    std::getline(ifile, sLine);
    char *chBuff = new char[sLine.size() + 1];
    OemToAnsi(sLine.c_str(), chBuff);
    AStrings->Add(chBuff);
    delete[]chBuff;
}
 
// ---------------------------------------------------------------------------
void CMD2Memo(TStrings *AStrings, const AnsiString &sCommandLine) {
    // корневая директория программы
    const AnsiString sRootDir = ExtractFilePath(Application->ExeName);
    // временные файлы, куда будем перенаправлять консоль
    const AnsiString sTempFileName = sRootDir + "temp_file_name~.cmd";
    const AnsiString sOutputFile = sRootDir + "stdout~.txt";
    // командную строку записываем в батник
    TFile::WriteAllText(sTempFileName, sCommandLine);
 
    // переменная которая будет показывать, что батник ещё исполняется
    DWORD dwAppRunning = 0;
 
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(sa);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = NULL;
 
    // создаём файл, куда будет перенаправляться вывод из консоли
    HANDLE hFile = CreateFileA(sOutputFile.c_str(), GENERIC_WRITE | GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, CREATE_ALWAYS, 0, NULL);
 
    SetFilePointer(hFile, 0, NULL, FILE_END);
 
    STARTUPINFOA si = {
        sizeof(STARTUPINFOA)
    };
 
    si.hStdOutput = hFile;
    si.hStdError = hFile;
    si.dwFlags = STARTF_USESTDHANDLES;
    si.wShowWindow = SW_HIDE;
 
    PROCESS_INFORMATION pi;
 
    // открываем созданный файл для чтения
    std::ifstream ifile(sOutputFile.c_str());
    if (!ifile.is_open()) {
        return;
    }
 
    // запускаем батник
    bool bSuccess = CreateProcessA(NULL, sTempFileName.c_str(), NULL, NULL, TRUE, 0, 0, 0, &si,
        &pi);
    if (bSuccess) {
        do {
            // проверяем, выполняется ли ещё процесс
            dwAppRunning = WaitForSingleObject(pi.hProcess, 100);
 
            // качаем порцию информации из файла
            if (ifile.good()) {
                AddOemLine(AStrings, ifile);
            }
 
            // даём возможность приложению обработать команду
            Sleep(5);
            Application->ProcessMessages();
 
        }
        while (dwAppRunning == WAIT_TIMEOUT);
    }
 
    // после того, как процесс завершён, окончательно допишем остатки информации из файла
    while (ifile.good()) {
        AddOemLine(AStrings, ifile);
    }
    ifile.close();
    CloseHandle(hFile);
 
    // добавляем текущую директорию
    AStrings->Add(GetCurrentDir() + ">");
}
 
// ---------------------------------------------------------------------------
void __fastcall TForm1::MemoInputKeyPress(TObject *Sender, wchar_t &Key) {
    if (Key == '\n') {
 
        MemoOutput->Lines->Add("===========================================");
        MemoOutput->Lines->Add(MemoInput->Lines->Text);
        MemoOutput->Lines->Add("===========================================");
 
        /* Так как команда CD не влияет на текущую директорию нашего процесса,
        то необходима продублировать выполнение смены директории самостоятельно */
        for (int i = 0; i < MemoInput->Lines->Count; i++) {
            std::auto_ptr<TStringList>AStringList(new TStringList());
            AStringList->StrictDelimiter = true;
            AStringList->Delimiter = ' ';
            AStringList->DelimitedText = MemoInput->Lines->Strings[i];
 
            if (AStringList->Count >= 2) {
                const UnicodeString sCommand = AStringList->Strings[0].UpperCase();
                if (sCommand == "CD" || sCommand == "CHDIR") {
                    const UnicodeString sChangeDir = AStringList->Strings[1].UpperCase();
                    if (sChangeDir == "/D") {
                        AStringList->Delete(1);
                    }
                    AStringList->Delete(0);
 
                    SetCurrentDir(AStringList->DelimitedText);
                }
            }
        }
 
        // выполняем командную строку
        CMD2Memo(MemoOutput->Lines, MemoInput->Lines->Text);
 
        // чистим поле для ввода
        MemoInput->Lines->Clear();
        Key = NULL;
 
    }
}
 
// ---------------------------------------------------------------------------
П.С. Всё делалось в CBuilder 2010

И ещё одно, для тех кому код не нужен, а нужно именно хорошее приложение такого формата, лучше всего воспользоваться командной консолью приложения Notepad++

Ну и собственно сам проект и екзешник, если кому пригодится.
Миниатюры
Использование memo как консоли  
Вложения
Тип файла: 7z Dos2Memo.7z (7.1 Кб, 125 просмотров)
Тип файла: 7z Dos2MemoM.7z (345.2 Кб, 112 просмотров)
4
3 / 3 / 0
Регистрация: 10.07.2009
Сообщений: 101
16.01.2012, 01:07  [ТС] 7
Maluda, ух, спасибо большое) Завтра с работы вернусь - попробую в нём разобраться)
0
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 7
28.01.2013, 22:52 8
Не компилируется проект в билдере2010. пишет не хватает библиотеки tmsd2010.bpi. усли ее игнорировать вылезает милион ошибок
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.01.2013, 02:02 9
Цитата Сообщение от Flyer Посмотреть сообщение
как по мне, так нужно копать в сторону пайпов
Насчет пайпов, тут вывод - Из консоли в Memo

Добавлено через 1 час 38 минут
Цитата Сообщение от Maluda
C++
1
2
3
4
5
6
// ---------------------------------------------------------------------------
void AddOemLine(TStrings *AStrings, std::ifstream & /* out */ ifile) {
     //....
    OemToAnsi(sLine.c_str(), chBuff); /* <- */
     //....
}
Можно заменить на
C++
1
typedef AnsiStringT<866> OEMString;    //  Строка в кодировке cp_666 ( OEM )
И дальше юзать OEMString где у нас OEM
Она может автоматом приводится к String
C++
1
2
OEMString OEMS;
String S = OEMS
Да и может не стоило так жестко мешать VCL+STL и WinApi ?
0
29.01.2013, 02:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2013, 02:02
Помогаю со студенческими работами здесь

Вывод консоли в memo + Открытие архива .img
доброе время суток. вот возник вопрос как перехватить консоль суть в том чтоб memo полностью...

Использование последних строк из Memo.
В Memo загружены данные содержащие 100 строк. И каждые 3 минуты добавляются новые строки с данными....

Использование MEMO для картинок
V Access97 zagrujal v OLE data type .bmp file. V VB6.0 cherez Data Control mog videt' etot file....

Как сделать так, чтобы Memo появлялось поверх остальных Memo?
как сделать так чтобы memo появлялось поверх остальных memo


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru