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

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

Автор: skinash
Дата сообщения: 11.09.2007 23:03
Chuvakstepan
[more=Как уменьшить размер EXE-файла (English)]Generally, EXE files created with Delphi are larger than EXE files created with another programming language. The reason is the VCL. (Sure, VCL has many advantages...)

There are several ways to reduce a EXE''s size:

01) Use a EXE-Packer (UPX, ASPack,...)
02) Use KOL.
03) Write your application without VCL
04) Use the ACL (API Controls Library)
05) Use StripReloc.
06) Deactivate remote debugging information and TD32.
07) You might want to put code in a dll.
08) Don''t put the same images several times on a form. Load them at runtime.
09) Use compressed images (JPG and not BMP)
10) Store less properties in DFM files
(See Link below "How To Make Your EXE''s Lighter")

11) Use the TStringList replacement by ~LOM~
Use the Minireg - TRegistry replacement by Ben Hochstrasser

01)
UPX is a free, portable, extendable, high-performance executable packer for several different executable formats. It achieves an excellent compression ratio and offers very fast decompression. Your executables suffer no memory overhead or other drawbacks.

http://upx.sourceforge.net/

ASPack is an advanced Win32 executable file compressor, capable of reducing the file size of 32-bit Windows programs by as much as 70%. (ASPack''s compression ratio improves upon the industry-standard zip file format by as much as 10-20%.) ASPack makes Windows 95/98/NT programs and libraries smaller, and decrease load times across networks, and download times from the internet; it also protects programs against reverse engineering by non-professional hackers.
Programs compressed with ASPack are self-contained and run exactly as before, with no runtime performance penalties.

http://www.aspack.com/aspack.htm

{****************************************************************}

02)
KOL - Key Objects Library is a set of objects to develop power (but small) 32 bit Windows GUI applications using Delphi but without VCL. It is distributed free of charge, with source code.

http://bonanzas.rinet.ru/

{****************************************************************}

03)
nonVCL
Delphi lets you have it both ways. If you want tiny EXE's, then don't use the VCL. Its entirely possible to use all the rich features of Delphi IDE using 100% WinAPI calls, standard resources, etc.

http://nonvcl.luckie-online.de
http://www.erm.tu-cottbus.de/delphi/stuff/Tutorials/nonVCL/index.html
http://www.angelfire.com/hi5/delphizeus/
http://www.tutorials.delphi-source.de/nonvcl/

{****************************************************************}

04)
ACL (API Controls Library)
To write the program on pure API certainly it is possible, but I have deci- ded to reach both goals - both to make that program and to receive the tool, through which it would be possible in further to build similar programs, almost, as on Delphi with VCL. So the idea to create my own TWinControl and all standard Windows controls classes, derived from it has appeared.

http://www.apress.ru/pages/bokovikov/delphi/index.html/

{****************************************************************}

05)
StripReloc is a free (GPL license) command line utility that removes the relocation (".reloc") section from Win32 PE EXE files, reducing their size. Most compilers/linkers (including Delphi) put a relocation section in EXE files, but this is actually not necessary since EXEs never get relocated. Hence, a relocation section only wastes space.

Why not use an EXE compressor?
http://www.jrsoftware.org/striprlc.php
{****************************************************************}

06)
Deactivating the Debug Information

Exclude any debug information for the final build (project-Options Compiler - Debugging and project-Options Linker EXE and DLL options) Dependeing on the amount of Debug information, Debugging can take up until half of the size.

The options that are going to singificantly reduce your file size are "Include TD32 debug info" and "Build with runtime packages". If you are shipping commercial applications, you usually don''t need the debug info linked with your project.

{****************************************************************}

08/09)
About Images

The forms in your project have any bitmaps on them, then these are compiled into the EXE. If you use the same bitmap multiple times, don''t assign them at design-time in the IDE as it will be included in the EXE multiple times, assign them in code instead.
This can help reduce the size of the EXE, especially if you use large bitmaps.

Use JPEG-files instead of BMP-files. This also reduces the EXE size.

{****************************************************************}

10)
How To Make Your EXE''s Lighter:
http://www.undu.com/DN970301/00000064.htm

{****************************************************************}

11)
TStringList replacement by ~LOM~
Minireg - TRegistry replacement
[/more]
Автор: Arvur
Дата сообщения: 11.09.2007 23:31
skinash
Сильно! Это откуда взято?

Цитата:
TStringList replacement by ~LOM~
Minireg - TRegistry replacement

Ссылок нет?
Автор: antonn2
Дата сообщения: 12.09.2007 07:34
минирег - http://www.torry.net/quicksearchd.php?String=minireg&Title=Yes

упаковщики - зло. экономя на десяткогигабайтных просторах винчестера, не экономим на оперативке, которой значительно меньше...
Автор: SERGE_BLIZNUK
Дата сообщения: 12.09.2007 08:24
antonn2

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

спорно (не то, что зло, а то, что оперативка расходуется - Дополнительный расход оперативки, думаю, не очень большой (десяток-другой килобайт) в сравнении с тем же exe файлом, но не запакованным... Кроме того, сейчас уже на домашних компах 2 ГБ не редкость. и в третьих, винда какой-никакой, но виртуальный своп имеет, т.е. она там рулит, что держать в памяти, а что нет. Поэтому бороться за то, чтобы exe файл уменьшился с 10 МБ до 1 МБ - зачастую просто трата сил и времени программиста (что стоит денег и немалых по сравнению с ценой ОЗУ).
удачи.
Автор: Grafus
Дата сообщения: 12.09.2007 09:06
A_V
Можно поподробнее? Я только учусь.
Автор: Chuvakstepan
Дата сообщения: 12.09.2007 14:11
Вообщем прочитал я это :
Цитата:
Как уменьшить размер EXE-файла (English)

и понял, что кроме UPX'a (аналог ASPACK) ничего не светит, ибо нет времени переписывать все компоненты с нуля. А убирать debug на release - эффекта в уменьшении размера никакого (странно)
Заметил то, что в uses используется много лишнего, поудалял половину, размер снизился с 1 МБ до 816 кб. Также перевёл картинки из bmp в jpg. Если выставлять gif, то в uses пропишется нечто, что будет в итоге весить даже немногим больше, чем результат в JPG
Вообщем совет - смотрите uses
Результат сжал UPX'ом + ZIP
Итого: 208 Кб
Автор: Arvur
Дата сообщения: 12.09.2007 14:38
Chuvakstepan
+1
Только для картинок я бы смотрел в сторону png - сжатие сильнее, качество выше.

Насчет debug есть подозрение, что не пересобираются dcu.
Можно попробовать собрать все используемое в uses в отдельный пакет и подключить его к проекту. Сам такого извращения не пробовал
Автор: Chuvakstepan
Дата сообщения: 12.09.2007 14:43
Можно вопросик
Как залить TImage градиентом, чтобы небыло косяков с изменением градиента, при перетаскивании формы

Arvur
попробую png, попробую отдельный компонент (только на 99% уверен, что размер не уменьшится, хотя чем чёрт не шутит! )
Автор: Arvur
Дата сообщения: 12.09.2007 15:06
Chuvakstepan

Цитата:
только на 99% уверен, что размер не уменьшится, хотя чем чёрт не шутит

При замене gif->png разница если и будет, то небольшая.
А результатами выноса vcl в отдельный пакет поделись плиз - самому интересно
Автор: OdesitVadim
Дата сообщения: 12.09.2007 15:50

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

Правильно
SERGE_BLIZNUK

Цитата:
Дополнительный расход оперативки, думаю, не очень большой (десяток-другой килобайт)

Ошибочка. Дело в том, что в памяти храниться запакованный и незапакованный образ программы (если только пакер не перетирает его). И в случае обычного ехе загрузчик может не грузить часть файла, а подгружать по мере надобности. И не с свопа, а с собственно самого файла (поэтому файл доступен только для чтения, когда он запущен)
И хотя в своп кое как бросает, но зачем туда бросать, если можно не бросать?

Цитата:
сейчас уже на домашних компах 2 ГБ не редкость

Мда, а в курсе, что без особых танцев больше 3.5 хр уже не может принять, хотя биос 4 и видит?
Автор: Chuvakstepan
Дата сообщения: 12.09.2007 16:10
Arvur

Цитата:
А результатами выноса vcl в отдельный пакет поделись плиз - самому интересно

Эх, такие чайники как я будут думать об этом долго да и времени почти нет, учёба, блин
Вариант все uses в отдельный компонент, а в главной написать uses этот.компонент
Ламерски как-то

Сделаю Timage градиентом (GradientRect) - буду думать
Люди с универа предлагают сделать картинку в Фотошопе размером на всю форму
Не катит

Автор: RostY
Дата сообщения: 12.09.2007 16:18
Chuvakstepan
Цитата:
Как залить TImage градиентом

нашел у себя какой-то антикварный компонент
Цитата:
A Gradient Fill component for Delphi.
посмотри, может что-то тебе подойдет:
[more]
{ ----------------------------------------------------------------------------}
{ A Gradient Fill component for Delphi. }
{ Copyright 1995, Curtis White. All Rights Reserved. }
{ Portions copyright 1995, OKO ROSNO, Moscow }
{ ----------------------------------------------------------------------------}
{ Date last modified: 16/06/95 }
{ ----------------------------------------------------------------------------}
{ TGradientFill v1.01 }
{ ----------------------------------------------------------------------------}
{ Revision History: }
{ 1.00: Initial release }
{ 1.01: Corrected by OKO ROSNO }
{ ----------------------------------------------------------------------------}

unit GradFill;

interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Menus,
{ Forms, Dialogs,} ExtCtrls;

type

{ Direction of fill }
TFillDirection = (fdTopToBottom, fdBottomToTop, fdLeftToRight, fdRightToLeft);

{ Range of valid colors }
TNumberOfColors = 1..255;

TGradientFill = class(TGraphicControl)
private
{ Variables for properties }
FDirection: TFillDirection;
FBeginColor: TColor;
FEndColor: TColor;
FCenter: Boolean;
FNumberOfColors: TNumberOfColors;
procedure SetFillDirection(Value: TFillDirection);
procedure SetBeginColor(Value: TColor);
procedure SetEndColor(Value: TColor);
procedure SetNumberOfColors(Value: TNumberOfColors);
procedure GradientFill;
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
published
property BeginColor: TColor read FBeginColor write SetBeginColor default clBlue;
property EndColor: TColor read FEndColor write SetEndColor default clBlack;
property FillDirection: TFillDirection read FDirection write SetFillDirection
default fdTopToBottom;
property NumberOfColors: TNumberOfColors read FNumberOfColors
write SetNumberOfColors default 64;
property Align;
property DragCursor;
property DragMode;
property Enabled;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property Visible;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;

{ Designer registration }

procedure Register;

implementation

{Uses ExtConst;}

{ Register the component }

{ TGradientFill }

{ Override the constructor to initialize variables }
constructor TGradientFill.Create(AOwner: TComponent);
begin
{ Inherit original constructor }
inherited Create(AOwner);
{ Add new initializations }
Height := 105;
Width := 105;
FBeginColor := clBlue;
FEndColor := clBlack;
FDirection := fdTopToBottom;
FNumberOfColors := 64;
end;

{ Set begin color when property is changed }
procedure TGradientFill.SetBeginColor(Value: TColor);
begin
if FBeginColor <> Value then begin
FBeginColor := Value;
Invalidate;
end;
end;

{ Set end color when property is changed }
procedure TGradientFill.SetEndColor(Value: TColor);
begin
if FEndColor <> Value then begin
FEndColor := Value;
Invalidate;
end;
end;

{ Set the number of colors to be used in the fill }
procedure TGradientFill.SetNumberOfColors(Value: TNumberOfColors);
begin
if FNumberOfColors <> Value then begin
FNumberOfColors := Value;
Invalidate;
end;
end;

{ Set the fill direction }
procedure TGradientFill.SetFillDirection(Value: TFillDirection);
begin
if Value <> FDirection then begin
FDirection := Value;
Invalidate;
end;
end;

{ Perform the fill when paint is called }
procedure TGradientFill.Paint;
begin
GradientFill;
end;

{ Gradient fill procedure - the actual routine }
procedure TGradientFill.GradientFill;
var
BeginRGBValue: array[0..2] of Byte; { Begin RGB values }
RGBDifference: array[0..2] of Integer; { Difference between begin and end RGB values }
ColorBand: TRect; { Color band rectangular coordinates }
I : Integer; { Color band index }
R : Byte; { Color band Red value }
G : Byte; { Color band Green value }
B : Byte; { Color band Blue value }
begin
{ Extract the begin RGB values }
case FDirection of
{ If direction is set to TopToBottom or LeftToRight }
fdTopToBottom, fdLeftToRight: begin
{ Set the Red, Green and Blue colors }
BeginRGBValue[0] := GetRValue(ColorToRGB(FBeginColor));
BeginRGBValue[1] := GetGValue(ColorToRGB(FBeginColor));
BeginRGBValue[2] := GetBValue(ColorToRGB(FBeginColor));
{ Calculate the difference between begin and end RGB values }
RGBDifference[0] := GetRValue(ColorToRGB(FEndColor)) - BeginRGBValue[0];
RGBDifference[1] := GetGValue(ColorToRGB(FEndColor)) - BeginRGBValue[1];
RGBDifference[2] := GetBValue(ColorToRGB(FEndColor)) - BeginRGBValue[2];
end;
{ If direction is set to BottomToTop or RightToLeft}
fdBottomToTop, fdRightToLeft: begin
{ Set the Red, Green and Blue colors }
{ Reverse of TopToBottom and LeftToRight directions }
BeginRGBValue[0] := GetRValue(ColorToRGB(FEndColor));
BeginRGBValue[1] := GetGValue(ColorToRGB(FEndColor));
BeginRGBValue[2] := GetBValue(ColorToRGB(FEndColor));
{ Calculate the difference between begin and end RGB values }
{ Reverse of TopToBottom and LeftToRight directions }
RGBDifference[0] := GetRValue(ColorToRGB(FBeginColor)) - BeginRGBValue[0];
RGBDifference[1] := GetGValue(ColorToRGB(FBeginColor)) - BeginRGBValue[1];
RGBDifference[2] := GetBValue(ColorToRGB(FBeginColor)) - BeginRGBValue[2];
end;
end; {case}
case FDirection of
{ Calculate the color band's top and bottom coordinates }
{ for TopToBottom and BottomToTop fills }
fdTopToBottom, fdBottomToTop: begin
ColorBand.Left := 0;
ColorBand.Right := Width;
end;
{ Calculate the color band's left and right coordinates }
{ for LeftToRight and RightToLeft fills }
fdLeftToRight, fdRightToLeft: begin
ColorBand.Top := 0;
ColorBand.Bottom := Height;
end;
end; {case}
with Canvas.Pen do begin
{ Set the pen style and mode }
Style := psSolid;
Mode := pmCopy;
end;
{ Perform the fill }
for I := 0 to FNumberOfColors do begin
case FDirection of
{ Calculate the color band's top and bottom coordinates }
fdTopToBottom, fdBottomToTop: begin
ColorBand.Top := MulDiv(I, Height, FNumberOfColors);
ColorBand.Bottom := MulDiv(I + 1, Height, FNumberOfColors);
end;
{ Calculate the color band's left and right coordinates }
fdLeftToRight, fdRightToLeft: begin
ColorBand.Left := MulDiv(I, Width, FNumberOfColors);
ColorBand.Right := MulDiv(I + 1, Width, FNumberOfColors);
end;
end; {case}
{ Calculate the color band's color }
if FNumberOfColors > 1 then begin
R := BeginRGBValue[0] + MulDiv(I, RGBDifference[0], FNumberOfColors - 1);
G := BeginRGBValue[1] + MulDiv(I, RGBDifference[1], FNumberOfColors - 1);
B := BeginRGBValue[2] + MulDiv(I, RGBDifference[2], FNumberOfColors - 1);
end
else begin
{ Set to the Begin Color if set to only one color }
R := BeginRGBValue[0];
G := BeginRGBValue[1];
B := BeginRGBValue[2];
end;
with Canvas do begin
{ Select the brush and paint the color band }
Brush.Color := RGB(R, G, B);
FillRect(ColorBand);
end;
end;
end;

procedure Register;
begin
RegisterComponents('Graph'{GetExtStr(srGadgets)}, [TGradientFill]);
end;

end.
[/more]

Добавлено:
и еще кусок статьи из DRKB:
[more]
Градиентная заливка и сложение цветов.

Иногда бывает нужно сложить два или более цветов для получения что-то типа переходного цвета.
Делается это весьма просто. Координаты получаемого цвета будут равны среднему значению
соответствующих координат всех цветов.

Например, нужно сложить красный и синий. Получаем
(255,0,0)+(0,0,255)=((255+0) div 2,(0+0) div 2,(0+255) div 2)=(127,0,127).

В результате получаем сиреневый цвет. Та2: сложить соответствующие координаты,
потом каждую сумму разделить нацело на количество цветов.

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

Итак, пусть заданы 2 цвета своими координатами ((A1, A2, A3) и (B1, B2, B3)) и
линия (длиной h пикселов), по которой нужно залить. Тогда каждый цвет каждого пиксела,
находящегося на расстоянии x пикселов от начала будет равен
(A1-(A1-B1)/h*x, A2-(A2-B2)/h*x, A3-(A3-B3)/h*x). Теперь, имея линию с
градиентной заливкой, можно таким образом залить
совершенно любую фигуру: будь то прямоугольник, круг или просто произвольная фигура.

Вот как выглядит описанный алгоритм:

{Считается, что координаты первого цвета равны (A1, A2, A3), а второго (B1, B2, B3)}
{Кроме того, линия начинается в координатах (X1,Y1), а заканчивается в (X2,Y1)}

Var h,i: Integer;

begin
h:=X2-X1-1;
for i:=0 to h do begin
PaintBox1.Canvas.Pen.Color:=RGB(A1-(A1-B1)/h*i, A2-(A2-B2)/h*i, A3-(A3-B3)/h*i);
PaintBox1.Canvas.Pen.Rectangle(I,Y1,I+1,Y1);
end;
end.

[/more]

Добавлено:
Chuvakstepan
а может стоит обработать OnPaint формы и рисовать градиент по канве формы без использования TImage?

Добавлено:
_http://www.delphipages.com/news/detaildocs.cfm?ID=94
Автор: Chuvakstepan
Дата сообщения: 12.09.2007 16:31
RostY
1995 год, я под стол пешком ходил называется
Были бы исходники - так оно не компилируется

Сколько инфы - сенькью
По поводу OnPaint формы - если форма выходит за пределы экрана градиент Стирается
Автор: RostY
Дата сообщения: 12.09.2007 16:51
Chuvakstepan
держи готовый проект:
[more]
unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TRIVERTEX = packed record
X, Y : DWORD;
Red, Green, Blue, Alpha : Word;
end;

function GradientFill(DC : hDC; pVertex : Pointer; dwNumVertex : DWORD;
pMesh : Pointer; dwNumMesh, dwMode: DWORD) : DWord; stdcall;
external 'msimg32.dll';

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormPaint(Sender: TObject);
var
vert : array[0..1] of TRIVERTEX;
gRect : GRADIENT_RECT;
begin
vert [0] .x := 0;
vert [0] .y := 0;
vert [0] .Red := $0000;
vert [0] .Green := $0000;
vert [0] .Blue := $0000;
vert [0] .Alpha := $0000;

vert [1] .x := width;
vert [1] .y := height;
vert [1] .Red := $0000;
vert [1] .Green := $0000;
vert [1] .Blue := $ff00;
vert [1] .Alpha := $0000;

gRect.UpperLeft := 0;
gRect.LowerRight := 1;
GradientFill(Form1.Canvas.Handle, @vert,2,@gRect,1,GRADIENT_FILL_RECT_H);
end;

end.

[/more]



Добавлено:
только-что сделал. компилится и не стирается (даже под стол форму утянул )
Автор: Chuvakstepan
Дата сообщения: 12.09.2007 16:58
RostY
может что-то я не так делаю, но:
1. создаю проект VCL Forms Apllication
2. Открываю Code
3. Выделяю всё - удаляю
4. Вставляю "держи готовый проект:"

Не пашет
P.S. Delphi 2007
Автор: RostY
Дата сообщения: 12.09.2007 16:59
Chuvakstepan
кинул мылом. Делал на Delphi-5.

Добавлено:
Your Download-Link #1: http://rapidshare.com/files/55154494/Project1.rar.html
Автор: Chuvakstepan
Дата сообщения: 12.09.2007 17:07
RostY
Спасибо! Кстати лучший способ! "Зе бест"!

Как я вижу градиент горизонтальный, можно спросить как сделать его вертикальным?

Добавлено:
Нашёл сам
GradientFill(Form1.Canvas.Handle, @vert,2,@gRect,1,GRADIENT_FILL_RECT_V);
Автор: Sampron
Дата сообщения: 12.09.2007 21:57
Chuvakstepan

Цитата:
Также перевёл картинки из bmp в jpg.

Подскажи как перевёл?
Автор: vserd
Дата сообщения: 13.09.2007 08:50
Arvur

Цитата:
А результатами выноса vcl в отдельный пакет поделись плиз - самому интересно

Еxe получается маленьким. но зато с собой приходится таскать несколько bpl на несколько десятков Mb.
Автор: Chuvakstepan
Дата сообщения: 13.09.2007 08:55

Цитата:
Подскажи как перевёл?

Элементарно, можно открыть bmp в Paint - сохранить в JPG. (Если ты об этом)
Я сохраняю в фотошопе, там можно выставить качество картинки

vserd
Да, ты прав. Не совсем лучшее решение

Добавлено:
Есть код, чтобы скрыть таскбар на XP

Код: ShowWindow(FindWindow('Shell_TrayWnd', nil), sw_hide);
Автор: lavren
Дата сообщения: 13.09.2007 10:29
Может кто нибуть помочь?
Нужно программно переиндексировать базу данных которая хранится в DBF-файле!
Автор: antonn2
Дата сообщения: 13.09.2007 11:19

Цитата:
Нужно программно переиндексировать базу данных которая хранится в DBF-файле!

"о, святая простота!"
что за база то хоть?
Автор: lavren
Дата сообщения: 13.09.2007 11:48
antonn2
DBE
Автор: Sampron
Дата сообщения: 13.09.2007 12:04
Chuvakstepan
Наверно я не понял твой пост, я думал что ты заменил TBitmapImage на TImage (сам компонент).
Автор: skinash
Дата сообщения: 13.09.2007 12:10
И ещё мои 5 копеек по поводу уменьшения ехе-шников: Очевидная вешь, если программа использует какие-нибудь 1-2 функции из "тяжёлых" модулей, то можно переписать эти функции к себе в unit, а из uses'ов этот "тяжёлый" можно удалить.
Ну и используйте StripReloc - немного подчищает exe-ник.
И ещё я ResourceHacker'ом (осторожно) удаляю из exe-шника неиспользуемые ресурсы.
Автор: RomanTim
Дата сообщения: 13.09.2007 12:14
skinash
Если в модуле именно функции, а не методы классов, то в екзешник линкуются только те, что используются, так что перетаскивать их к себе смысла не имеет
Автор: RostY
Дата сообщения: 13.09.2007 12:50
lavren
через квери create index не пробовал ? типа как в хелпе пишут:

Цитата:
CREATE UNIQUE INDEX namex ON "employee.dbf" (last_name)


Добавлено:

Поздравляю всех Delphi-программистов с профессиональным праздником (256-м днем года). Желаю успешных компиляций, творческих успехов и финансового благополучия.

p.s. так как программисты на Си считают с нуля, то у них сегодня только 255-й день года
Автор: Chuvakstepan
Дата сообщения: 13.09.2007 14:07
skinash

Цитата:
StripReloc

Можно поподробней?

Добавлено:
RostY
Автор: George_Lucky
Дата сообщения: 13.09.2007 14:12
Вопрос:

Как из строки windows-1251 кодировки получить dos-866 ?
Автор: antonn2
Дата сообщения: 13.09.2007 14:21

Цитата:
p.s. так как программисты на Си считают с нуля, то у них сегодня только 255-й день года

бедные программисты на С, они встречают Новый Год когда все уже отметили... Тормоза
завтра у программистов на С будет переполнение, остерегайтесь %)

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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