![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
mysql koi8-r !!! [D6, MySQL]
japer © (2003-06-05 17:12:00)Доброго времени суток уважаемые эксперты.
Проблема вот в чем мне надо на делфи сделать клиента для мускула.
Как заставить делфи заносить данный в таблицу в koi8-r!
japer (2003-06-06 13:18:00) [1]Большое спасибо за совет.
Дмитрий Баранов (2003-06-06 10:45:00) [2]уточнение: это я показал принцип перекодировки "на лету", т.е на самом деле, имхо, в реализации компонента должен быть какой-то внутренний буфер, в который пишется перекодированная в koi строка, и именно эта перекодированная строка должна вноситься в базу, в контроле же должен отображаться обычный (в win1251) текст.
Дмитрий Баранов (2003-06-06 10:39:00) [3]Вот взглюкнуло-то...
501 - Not implemented
Дмитрий Баранов (2003-06-06 10:38:00) [4]msdn.microsoft.com,
Win32 SDK:
см.
Window Procedure,
DefWindowProc,
CallWindowProc,
SetWindowLong
Например - подмена оконной процедуры с изменением обработчика сообщения WM_CHAR:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
lPrevAddr: ULONG;
implementation
function TmpWindowProc(Handle: HWND; Message: UINT; wPrm: integer; lPrm: integer): LRESULT; stdcall;
begin
case Message of
WM_CHAR:
begin
case (Char(wPrm)) of
"a": wPrm := cardinal("b");
"b": wPrm := cardinal("a");
end;
end;
end;
result := CallWindowProc(pointer(lPrevAddr), Handle, Message, wPrm, lPrm);
end;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
lPrevAddr := GetWindowLong(Edit1.Handle, GWL_WNDPROC);
SetWindowLong(Edit1.Handle, GWL_WNDPROC , integer(@TmpWindowProc));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetWindowLong(Edit1.Handle, GWL_WNDPROC , lPrevAddr);
end;
end.
Т.е. - здесь - жмешь a - печатается b и наоборот. Принцип понятен? Таблицы перекодировок найдешь на delphikingdom.com.
В данном случае можно пробежаться по всем нужным контролам и в конструкторе формы засунуть адрес старой оконной процедуры в св-во Tag контрола, в деструкторе вернуть его на место.
Кроме WM_CHAR надо не забыть про WM_SETTEXT, сообщения буфера и пр.
Второй вариант - создать пакет Data-компонентов, наследников от DBEdit и т.п., где - аналогично - переписать обработчики тех же сообщений.
Третий вариант - пошукать эти кем-то наверняка уже написанные компоненты в интернете :-))
Дмитрий Баранов (2003-06-06 10:38:00) [5]msdn.microsoft.com,
Win32 SDK:
см.
Window Procedure,
DefWindowProc,
CallWindowProc,
SetWindowLong
Например - подмена оконной процедуры с изменением обработчика сообщения WM_CHAR:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
lPrevAddr: ULONG;
implementation
function TmpWindowProc(Handle: HWND; Message: UINT; wPrm: integer; lPrm: integer): LRESULT; stdcall;
begin
case Message of
WM_CHAR:
begin
case (Char(wPrm)) of
"a": wPrm := cardinal("b");
"b": wPrm := cardinal("a");
end;
end;
end;
result := CallWindowProc(pointer(lPrevAddr), Handle, Message, wPrm, lPrm);
end;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
lPrevAddr := GetWindowLong(Edit1.Handle, GWL_WNDPROC);
SetWindowLong(Edit1.Handle, GWL_WNDPROC , integer(@TmpWindowProc));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetWindowLong(Edit1.Handle, GWL_WNDPROC , lPrevAddr);
end;
end.
Т.е. - здесь - жмешь a - печатается b и наоборот. Принцип понятен? Таблицы перекодировок найдешь на delphikingdom.com.
В данном случае можно пробежаться по всем нужным контролам и в конструкторе формы засунуть адрес старой оконной процедуры в св-во Tag контрола, в деструкторе вернуть его на место.
Кроме WM_CHAR надо не забыть про WM_SETTEXT, сообщения буфера и пр.
Второй вариант - создать пакет Data-компонентов, наследников от DBEdit и т.п., где - аналогично - переписать обработчики тех же сообщений.
Третий вариант - пошукать эти кем-то наверняка уже написанные компоненты в интернете :-))
Дмитрий Баранов (2003-06-06 10:38:00) [6]msdn.microsoft.com,
Win32 SDK:
см.
Window Procedure,
DefWindowProc,
CallWindowProc,
SetWindowLong
Например - подмена оконной процедуры с изменением обработчика сообщения WM_CHAR:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
lPrevAddr: ULONG;
implementation
function TmpWindowProc(Handle: HWND; Message: UINT; wPrm: integer; lPrm: integer): LRESULT; stdcall;
begin
case Message of
WM_CHAR:
begin
case (Char(wPrm)) of
"a": wPrm := cardinal("b");
"b": wPrm := cardinal("a");
end;
end;
end;
result := CallWindowProc(pointer(lPrevAddr), Handle, Message, wPrm, lPrm);
end;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
lPrevAddr := GetWindowLong(Edit1.Handle, GWL_WNDPROC);
SetWindowLong(Edit1.Handle, GWL_WNDPROC , integer(@TmpWindowProc));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetWindowLong(Edit1.Handle, GWL_WNDPROC , lPrevAddr);
end;
end.
Т.е. - здесь - жмешь a - печатается b и наоборот. Принцип понятен? Таблицы перекодировок найдешь на delphikingdom.com.
В данном случае можно пробежаться по всем нужным контролам и в конструкторе формы засунуть адрес старой оконной процедуры в св-во Tag контрола, в деструкторе вернуть его на место.
Кроме WM_CHAR надо не забыть про WM_SETTEXT, сообщения буфера и пр.
Второй вариант - создать пакет Data-компонентов, наследников от DBEdit и т.п., где - аналогично - переписать обработчики тех же сообщений.
Третий вариант - пошукать эти кем-то наверняка уже написанные компоненты в интернете :-))
Дмитрий Баранов (2003-06-06 10:38:00) [7]msdn.microsoft.com,
Win32 SDK:
см.
Window Procedure,
DefWindowProc,
CallWindowProc,
SetWindowLong
Например - подмена оконной процедуры с изменением обработчика сообщения WM_CHAR:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
lPrevAddr: ULONG;
implementation
function TmpWindowProc(Handle: HWND; Message: UINT; wPrm: integer; lPrm: integer): LRESULT; stdcall;
begin
case Message of
WM_CHAR:
begin
case (Char(wPrm)) of
"a": wPrm := cardinal("b");
"b": wPrm := cardinal("a");
end;
end;
end;
result := CallWindowProc(pointer(lPrevAddr), Handle, Message, wPrm, lPrm);
end;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
lPrevAddr := GetWindowLong(Edit1.Handle, GWL_WNDPROC);
SetWindowLong(Edit1.Handle, GWL_WNDPROC , integer(@TmpWindowProc));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetWindowLong(Edit1.Handle, GWL_WNDPROC , lPrevAddr);
end;
end.
Т.е. - здесь - жмешь a - печатается b и наоборот. Принцип понятен? Таблицы перекодировок найдешь на delphikingdom.com.
В данном случае можно пробежаться по всем нужным контролам и в конструкторе формы засунуть адрес старой оконной процедуры в св-во Tag контрола, в деструкторе вернуть его на место.
Кроме WM_CHAR надо не забыть про WM_SETTEXT, сообщения буфера и пр.
Второй вариант - создать пакет Data-компонентов, наследников от DBEdit и т.п., где - аналогично - переписать обработчики тех же сообщений.
Третий вариант - пошукать эти кем-то наверняка уже написанные компоненты в интернете :-))
Дмитрий Баранов (2003-06-06 10:37:00) [8]msdn.microsoft.com,
Win32 SDK:
см.
Window Procedure,
DefWindowProc,
CallWindowProc,
SetWindowLong
Например - подмена оконной процедуры с изменением обработчика сообщения WM_CHAR:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
lPrevAddr: ULONG;
implementation
function TmpWindowProc(Handle: HWND; Message: UINT; wPrm: integer; lPrm: integer): LRESULT; stdcall;
begin
case Message of
WM_CHAR:
begin
case (Char(wPrm)) of
"a": wPrm := cardinal("b");
"b": wPrm := cardinal("a");
end;
end;
end;
result := CallWindowProc(pointer(lPrevAddr), Handle, Message, wPrm, lPrm);
end;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
lPrevAddr := GetWindowLong(Edit1.Handle, GWL_WNDPROC);
SetWindowLong(Edit1.Handle, GWL_WNDPROC , integer(@TmpWindowProc));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetWindowLong(Edit1.Handle, GWL_WNDPROC , lPrevAddr);
end;
end.
Т.е. - здесь - жмешь a - печатается b и наоборот. Принцип понятен? Таблицы перекодировок найдешь на delphikingdom.com.
В данном случае можно пробежаться по всем нужным контролам и в конструкторе формы засунуть адрес старой оконной процедуры в св-во Tag контрола, в деструкторе вернуть его на место.
Кроме WM_CHAR надо не забыть про WM_SETTEXT, сообщения буфера и пр.
Второй вариант - создать пакет Data-компонентов, наследников от DBEdit и т.п., где - аналогично - переписать обработчики тех же сообщений.
Третий вариант - пошукать эти кем-то наверняка уже написанные компоненты в интернете :-))
japer (2003-06-06 06:44:00) [9]Тих спасибо за ответ.
> 1) Подменить оконную процедуру (в цикле по компонентам формы)
> или написать наследников для всех DATA-контролов, на WM_CHAR,
> WM_SETTEXT и пр. - поставить перекодировку или поискать
> готовые компоненты для koi...
Хотелось бы поподробнее на эту тему или ссылочку на инфу
> 3) Еще проще - перенастроить MySQL для cp1251; я предполагаю,
> что тебе клиент нужен для удаленного управления? если не
> ошибаюсь, то - win-1251 - стандарт де-факто для русскоязычного
> интернета, а koi8-для русскоязычной электронной почты, и
> потому имеет смысл делать сайт все-таки под cp1251.
Не подходит данные должны быть именно в koi8-r т.к треба будет работать и из под линукс также
Тих (2003-06-06 01:35:00) [10]Если навскидку -
1) Подменить оконную процедуру (в цикле по компонентам формы) или написать наследников для всех DATA-контролов, на WM_CHAR, WM_SETTEXT и пр. - поставить перекодировку или поискать готовые компоненты для koi...
2) Сделать интерфейс на основе TWebBrowser, с HTML-формами в koi.
3) Еще проще - перенастроить MySQL для cp1251; я предполагаю, что тебе клиент нужен для удаленного управления? если не ошибаюсь, то - win-1251 - стандарт де-факто для русскоязычного интернета, а koi8-для русскоязычной электронной почты, и потому имеет смысл делать сайт все-таки под cp1251.
Вполне возможно, что можно и гораздо проще )) как - не знаю. MSDN молчит.