Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (все версии) - часть 3

Автор: akaGM
Дата сообщения: 15.03.2008 14:39
хочу простую реализации вин-консоли, из функционала достаточно только расцвечивания выводимого по writeln() текста...
бродящие по сети wincrt32 и crt32 не понравились, громоздко и, вообше говоря, некрасиво

кто что скажет?
Автор: Jokerjar79
Дата сообщения: 16.03.2008 16:32
Вот нашел исходник, присутствует реализация базовых функций для проектирования консольных приложений. Протестил на Turbo Delphi 2006

[more]program Con001;
{$APPTYPE CONSOLE}
uses Windows, SysUtils;

const
// Некоторые стандартные цвета
YellowOnBlue = FOREGROUND_GREEN OR FOREGROUND_RED OR
FOREGROUND_INTENSITY OR BACKGROUND_BLUE;
WhiteOnBlue = FOREGROUND_BLUE OR FOREGROUND_GREEN OR
FOREGROUND_RED OR FOREGROUND_INTENSITY OR
BACKGROUND_BLUE;
RedOnWhite = FOREGROUND_RED OR FOREGROUND_INTENSITY OR
BACKGROUND_RED OR BACKGROUND_GREEN OR BACKGROUND_BLUE
OR BACKGROUND_INTENSITY;
WhiteOnRed = BACKGROUND_RED OR BACKGROUND_INTENSITY OR
FOREGROUND_RED OR FOREGROUND_GREEN OR FOREGROUND_BLUE
OR FOREGROUND_INTENSITY;

var
ConHandle : THandle; // Дескриптор консольного окна
Coord : TCoord; // Для хранения/установки позиции экрана
MaxX, MaxY : Word; // Для хранения максимальных размеров окна
CCI : TConsoleCursorInfo;
NOAW : Cardinal; // Для хранения результатов некоторых функций

//-----------------------------------------
// Получение дескриптора для консольного ввода
//-----------------------------------------
function GetConInputHandle : THandle;
begin
Result := GetStdHandle(STD_INPUT_HANDLE)
end;
//-----------------------------------------
// Получение дескриптора для консольного вывода
//-----------------------------------------
function GetConOutputHandle : THandle;
begin
Result := GetStdHandle(STD_OUTPUT_HANDLE)
end;
//-----------------------------------------
// Установка курсора в координаты X, Y
//-----------------------------------------
procedure GotoXY(X, Y : Word);
begin
Coord.X := X; Coord.Y := Y;
SetConsoleCursorPosition(ConHandle, Coord);
end;
//-----------------------------------------
// Очистка экрана - заполнение его пробелами
//-----------------------------------------
procedure Cls;
begin
Coord.X := 0; Coord.Y := 0;
FillConsoleOutputCharacter(ConHandle, ' ', MaxX*MaxY, Coord, NOAW);
GotoXY(0, 0);
end;
//--------------------------------------
// Показываем/Скрываем курсор
//--------------------------------------
procedure ShowCursor(Show : Bool);
begin
CCI.bVisible := Show;
SetConsoleCursorInfo(ConHandle, CCI);
end;
//--------------------------------------
// Инициализация глобальных переменных
//--------------------------------------
procedure Init;
begin
// Получаем дескриптор вывода (output)
ConHandle := GetConOutputHandle;
// Получаем максимальные размеры окна
Coord := GetLargestConsoleWindowSize(ConHandle);
MaxX := Coord.X;
MaxY := Coord.Y;
end;
//---------------------------------------
// рисуем строку статуса ("status line")
//---------------------------------------
procedure StatusLine(S : String);
begin
Coord.X := 0; Coord.Y := 0;
WriteConsoleOutputCharacter(ConHandle, PChar(S), Length(S)+1, Coord, NOAW);
FillConsoleOutputAttribute (ConHandle, WhiteOnRed, Length(S), Coord, NOAW);
end;

//-----------------------------------------------------
// Консольный обработчик событий
//-----------------------------------------------------
function ConProc(CtrlType : DWord) : Bool; stdcall; far;
var
S : String;
begin
case CtrlType of
CTRL_C_EVENT : S := 'CTRL_C_EVENT';
CTRL_BREAK_EVENT : S := 'CTRL_BREAK_EVENT';
CTRL_CLOSE_EVENT : S := 'CTRL_CLOSE_EVENT';
CTRL_LOGOFF_EVENT : S := 'CTRL_LOGOFF_EVENT';
CTRL_SHUTDOWN_EVENT : S := 'CTRL_SHUTDOWN_EVENT';
else
S := 'UNKNOWN_EVENT';
end;
MessageBox(0, PChar(S + ' detected'), 'Win32 Console', MB_OK);
Result := True;
end;
{
[]---------------------------------------------------------------[]
Основная программа - показывает использование некоторых подпрограмм
а так же некоторых функций консольного API
[]---------------------------------------------------------------[]
}
var
R : TSmallRect;
Color : Word;
OSVer : TOSVersionInfo;
IBuff : TInputRecord;
IEvent : DWord;
Continue : Bool;

begin
// Инициализация глобальных переменных
Init;
// Расположение окна на экране
With R do
{!! 1.01 !!}
begin
Left := 10; Top := 10; Right := 40; Bottom := 40;
end;
{!! 1.01 !!}
SetConsoleWindowInfo(ConHandle, False, R);
// Устанавливаем обработчик событий
SetConsoleCtrlHandler(@ConProc, True);
// Проверяем обработчик событий
GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
// Изменяем заголовок окна
SetConsoleTitle('Console Demo');
// Прячем курсор
ShowCursor(False);
Coord.X := 0; Coord.Y := 0;
// Устанавливаем белый текст на синем фоне
Color := WhiteOnBlue;
FillConsoleOutputAttribute(ConHandle, Color, MaxX*MaxY, Coord, NOAW);
// Console Code Page API is not supported under Win95 - only GetConsoleCP
Writeln('Console Code Page = ', GetConsoleCP);
Writeln('Max X=', MaxX,' Max Y=', MaxY);
Readln; // ожидаем ввода пользователя
Cls; // очищаем экран
ShowCursor(True); // показываем курсор
//
// Use some Win32API stuff
//
OSVer.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(OSVer);
With OSVer do
Begin
Writeln('dwMajorVersion = ', dwMajorVersion);
Writeln('dwMinorVersion = ', dwMinorVersion);
Writeln('dwBuildNumber = ', dwBuildNumber);
Writeln('dwPlatformID = ', dwPlatformID);
End;

//
Readln; // ожидаем ввода пользователя
// Удаляем обработчик событий
SetConsoleCtrlHandler(@ConProc, False);
Cls;
//
// "Цикл обработки сообщений"
//
Continue := True;
While Continue do
Begin
ReadConsoleInput(GetConInputHandle, IBuff, 1, IEvent);
Case IBuff.EventType of
KEY_EVENT : Begin
// Проверяем клавишу ESC и завершаем программу
If ((IBuff.Event.KeyEvent.bKeyDown = True) AND
(IBuff.Event.KeyEvent.wVirtualKeyCode = VK_ESCAPE)) Then
Continue := False;
End;
_MOUSE_EVENT : Begin
With IBuff.Event.MouseEvent.dwMousePosition do
StatusLine(Format('%d, %d', [X, Y]));
End;
end;
End {While}
end.[/more]
Автор: akaGM
Дата сообщения: 16.03.2008 22:32
Jokerjar79
спасибо...
я тоже нашёл, очень маленькую crt'шку из порта ТурбоВизион под Дельфи3.0
пока вроде устроила...
Автор: xy
Дата сообщения: 16.03.2008 23:14
akaGM

Цитата:
а с другой стороны, ты много знаешь редакторов с подсветкой *.ini,
a *.xml?

суть ини-файла, в том что там можно хранить базовые настройки и состояние приложения
причём оно доступно и ситабельно безо всяких подсветок :)

--

Народ, подскажите плиз такую вещь по самому языку (призабыл уже):
в паскале насколько я помню, если объявить переменную в глобальной части юнита - она инциализируется автоматически (т.е. строки пустые, в числах нули и т.п.)
если объявить локально в функции - то там мусор всякий, надо инициализацию ручную обзательно

в дельфи это поведение сохранено для переменных..

но я не уверен на счёт record - подскажите как оно себя ведет для таких типов, нужно их инициализировать при глобальном объявлении, при локальном и как это удобнее делать :-? а то типы большие бывают.. проще в класс их переделать, но классы передаются в функции и обратно не так как хотелось бы :)
Автор: Frodo_Torbins
Дата сообщения: 17.03.2008 00:03
А чего их инициализировать? FillChar да и все.
На счет сложностей с передачей классов в функции можно подробнее?
Автор: xy
Дата сообщения: 17.03.2008 01:09
Frodo_Torbins
хмм.. есть рекорд, где разнотипных полей много.. скажем

Код:
type
TMyRecord = record
Report: TfrxReport;
Result: TModalResult;

Type: Integer;
Code: Integer;

Name : String;
Name2 : String;
Name22 : String;

Num : String;
Series : String;
Date : TDateTime;
end;
Автор: Andrey128
Дата сообщения: 17.03.2008 05:42
Как программно сделать иконку красной?

В TreeView есть разные иконки, и некоторые узлы должны выглядеть красными иконками. Сейчас делаю так:
1. Открываю иконку в Axialis IconWorkshop. Иконка должна быть формата XP with Alpha Channel (RGB - 24 bits)
2. Открываю диалог Adjust Hue - Saturation - Brightness
3. Делаю
[x] Colorize
Hue -180
Saturation +100
Brightness 0
и иконка становится красной без потери изображения

Когда иконок было мало, проблем не было, а сейчас их стало много и хотелось бы процесс автоматизтровать.
Автор: Jokerjar79
Дата сообщения: 17.03.2008 06:17
Делай в самой программе. Грузишь иконку в TIcon. Создаешь TBitMap, рисуешь на нем иконку и "краснишь"

[more=Преобразование цветного изображение в оттенки одного]procedure ModColors(Bitmap: TBitmap; Color: TColor);

function GetR(const Color: TColor): Byte;
begin
Result := Lo(Color);
end;

function GetG(const Color: TColor): Byte;
begin
Result := Lo(Color shr 8);
end;

function GetB(const Color: TColor): Byte;
begin
Result := Lo((Color shr 8) shr 8);
end;

function BLimit(B: Integer): Byte;
begin
if B < 0 then
Result := 0
else
if B > 255 then
Result := 255
else
Result := B;
end;

type
TRGB = record
B, G, R: Byte;
end;
pRGB = ^TRGB;
var
r1, g1, b1: Byte;
x, y: Integer;
Dest: pRGB;
A: Double;
begin
Bitmap.PixelFormat := pf24Bit;
r1 := Round(255 / 100 * GetR(Color));
g1 := Round(255 / 100 * GetG(Color));
b1 := Round(255 / 100 * GetB(Color));
for y := 0 to Bitmap.Height - 1 do
begin
Dest := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do
begin
with Dest^ do
begin
A := (r + b + g) / 300;
with Dest^ do
begin
R := BLimit(Round(r1 * A));
G := BLimit(Round(g1 * A));
B := BLimit(Round(b1 * A));
end;
end;
Inc(Dest);
end;
end;
end;[/more]
Автор: ILSOFT
Дата сообщения: 17.03.2008 07:22
xy

Цитата:
Код:
type
TMyRecord = record
Report: TfrxReport;
Result: TModalResult;

Type: Integer;
Code: Integer;

Name : String;
Name2 : String;
Name22 : String;

Num : String;
Series : String;
Date : TDateTime;
end;


есть функция обработки например:
function MyDialog(ARec: TMyRecord): TMyRecord;

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


Вариантов куча! Вот 3 на вскидку...
решение 1 - заполнить структуру нолями:

Код: procedure XYZ;
var
Params: TMyRecord;
begin
FillChar(Params,sizeof(TMyRecord),0);
{ че то делаем }
end;
Автор: xy
Дата сообщения: 17.03.2008 07:34
ILSOFT
Спасибо! второй вариант более красив и симпатичен мне :)

Добавлено:
процедурой зачистки сейчас и пользуюсь, хотелось что-нить изящней
Автор: myxa0
Дата сообщения: 17.03.2008 09:19
Как уменьшить чб (1bit) изображение по ширине и высоте так, чтобы результирующее изображение осталось однобитовым изображением?
Автор: rustamakhmetov
Дата сообщения: 17.03.2008 09:48
Поделитесь, плиз, дистрибом EmbeddedWB
Сайт разработчика: bsalsa.com -- закрыт

Спасибо!
Автор: akaGM
Дата сообщения: 17.03.2008 13:26
xy

Цитата:
суть ини-файла, в том что там можно хранить..

суть xml-файла в том, что в нём можно хранить _что угодно_...


Цитата:
причём оно доступно и ситабельно безо всяких подсветок

не я завёл разговор об удобстве редактирования ini-xml ручками...
так ручками _удобнее_ править хмл в редакторе, а ini -- делать это всего лишь оперативнее...

record
всё равно не вижу проблему с их инициализацией
если программа содержит что-то типа:

Код: type
Tmyrec = record
field1:
field2:
end;
var
myRec: Tmyrec;

begin
name := myrec.field1;
writeln(myrec.field2); // т.е сразу же "правостореннее" использование
end.
Автор: xy
Дата сообщения: 17.03.2008 23:40
akaGM
так и вопрос был о том, как компактней и правильнее такое инициализировать
Автор: ILSOFT
Дата сообщения: 18.03.2008 07:17
akaGM
xy
может вместо xml поглядеть на это чудо - http://www.json.org/ и реализация на паскале http://sourceforge.net/projects/lkjson
Автор: skinash
Дата сообщения: 18.03.2008 10:17
ILSOFT
Чего только не придумают Тот же хрен, вид сбоку Чтож, кому то джава удобней.
Автор: akaGM
Дата сообщения: 18.03.2008 13:44
xy
ты хочешь какие-то универсальные приёмы использовать?

компактней -- или нулями забивать
или константами
myRec := mydefaultRec_const;

ведь всё же от задачи зависит...


ILSOFT
хмл -- давно стандарт, кросс-платформа, библиотек до фига, зачем? от добра добра не ищут...
Автор: xy
Дата сообщения: 18.03.2008 16:44
akaGM
согласен, просто вот возник такой вопрос :)
кстати как сама дельфи инициализирует локально объявленные рекорды так никто и не ответил, но насколько я понял - забивает их мусором, как и обычные переменные..
Автор: Jokerjar79
Дата сообщения: 18.03.2008 16:51
Да, мусором. Это ж по сути тоже переменная, только сложного типа данных. При локальном объявлении помещается в стек
Автор: akaGM
Дата сообщения: 18.03.2008 17:24
xy
Цитата:
кстати как сама дельфи инициализирует локально объявленные рекорды
никак

Jokerjar79
Цитата:
При локальном объявлении помещается в стек
строго говоря, ничего никуда не помещается...
на стеке резервируется общий объем, достаточный для хранения всех локалов и всё...

Автор: Sampron
Дата сообщения: 18.03.2008 18:03
Скажите пожалуйста возможно ли в делфи создать форму с обработками событий без ресурсов? Форма создаётся а обработки событий не работают
[more=Код..]
program Main;

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

var
MainForm: TForm;

procedure MainFormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
//Perform(WM_SYSCOMMAND, SC_MOVE+2, 0); //не работает
end;

begin
Application.Initialize;
Application.CreateForm(TForm, MainForm);
MainForm.Width:=500;
MainForm.Height:=300;
MainForm.BorderStyle:=bsNone;
MainForm.Position:=poScreenCenter;
//MainForm.OnMouseDown:=MainFormMouseDown; //не работает
Application.Run;
end.
[/more]
Автор: Frodo_Torbins
Дата сообщения: 18.03.2008 18:48
Sampron
Сомневаюсь, что такое возможно. И зачем это вообще надо? Хотите сэкономить - юзайте KOL.
Автор: akaGM
Дата сообщения: 18.03.2008 18:57
Sampron
глянь, может так будет...

Код:
procedure MainFormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
TForm(Sender).Perform(WM_SYSCOMMAND, SC_MOVE+2, 0);
end;

begin
Application.Initialize;
Application.CreateForm(TForm, MainForm);
MainForm.Width:=500;
MainForm.Height:=300;
MainForm.Position:=poScreenCenter;
MainForm.OnMouseDown:=TMouseEvent((@MainFormMouseDown)^); // гы
Application.Run;
end.
Автор: Sampron
Дата сообщения: 18.03.2008 19:20
akaGM
Не работает
Первую проблему я решил так:
SendMessage(MainForm.Handle, WM_SYSCOMMAND, $F012, 0);

а вторую несмог:
MainForm.OnMouseDown:=MainFormMouseDown; //не работает
выдаёт ошибку:
Incompatible types: method pointer and regular procedure

MainForm.OnMouseDown:=TMouseEvent((@MainFormMouseDown)^); //не работает
при нажатии на форму выдаёт ошибку по адресу...

Автор: akaGM
Дата сообщения: 18.03.2008 19:25
Sampron
ну правильно, MainFormMouseDown должна быть методом класса (... of object), а не обычной процедурой...
объявляй её в классе формы или садись на АПИ и всё у тебя будет...

зачем это всё тебе? dfm / классы не любишь? всё равно в размерах ничего не выиграешь,
только геморрой наживёшь...
Автор: Sampron
Дата сообщения: 18.03.2008 19:38
akaGM
Понял, спасибо.
Автор: fcdobpiy
Дата сообщения: 18.03.2008 20:58
akaGM
xml конечно стандарт, но вот если тебе надо вручную подредактировать параметры, втом же блокноте - тяжеловато в обработке.
а с ини файлами проще, в любом редакторе открыл и гляди.

у нас вообще dbf файлы используются все еще . много дос программ работает с дбф, так по привычке и в новые виндовые парметры и помелочи хранится в дбф
Автор: akaGM
Дата сообщения: 18.03.2008 21:31
fcdobpiy
Цитата:
тебе надо вручную подредактировать параметры, втом же блокноте - тяжеловато в обработке.

тебе -- кому? -- разработчику? сколько раз в день это делается? а кому щас легко?
юзеру? -- не фиг ему там делать, для него гуй сделан...
ты вот dbf используешь, а у меня полно db из россыпи текстовых файлов, и ничего, всё работает...
или те же конфиги на плоском тексте...

я никого ни за что не агитирую, что использую сам -- о том и говорю...
Автор: fcdobpiy
Дата сообщения: 19.03.2008 07:05
akaGM
я про юзвера.
тут зависит от разработчика - если он в гуи даст полный доступ к анстройкам , то хорошо, а иначе прямая дорога к ковырянию конфига.

ты писал что библиотек дофига. а какую советовал бы под делфю, желательно не сильно навороченну - главное чтоб писала и читала. я вот недавно использовал xmlparser . впринципе не особо сложно, но хотелось бы проще ... хоть новый класс на основе этого пиши.
Автор: greenpc
Дата сообщения: 19.03.2008 07:29
fcdobpiy
попробуй NativeXml _http://www.simdesign.nl/xml.html

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: 1С: Конвертация данных 2.0


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.