ktulho 5,791 #219163 Posted October 2, 2014 Очень бы помогли, если бы смогли отловить при каких именно условиях вываливается ошибка. Какой-то нюанс не отработан, искать его в лоб буду долго, ваши подсказки бы пригодились. Ошибка выскакивает в любых случаях, даже если я нажимаю "Отмена". Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #219165 Posted October 2, 2014 Ошибка выскакивает в любых случаях, даже если я нажимаю "Отмена". Подробнее нельзя? Я не телепат. Где чего когда нажимаете. Quote Share this post Link to post Short link Share on other sites
coJlHe4Hblu_noH4uk 141 #219169 Posted October 2, 2014 (edited) А стрелочками с клавы Очень привык к Adobe, поэтому про колесико вспомнил сразу. Теперь про LCh (не LCH как в XCPad, а LCh именно, знаю, что занудство, но так правильно) - Слева Lab, по центру то, что выдает XCPad, справа то, что должно быть. LCh.zip Edited October 2, 2014 by DotNetFramework Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #219175 Posted October 2, 2014 (edited) , я делал по формуле, выше и то что выдает программа совпадает с тыц. С той лишь разнице что в программе у меня c в % от sqrt(2)*128. В основном совпадет. Откуда ты взял цифры в xml в последней колонке я не понял Название LCH поменяю на Lch (как по аналогии с Lab) Edited October 2, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
ktulho 5,791 #219176 Posted October 2, 2014 Подробнее нельзя? Я не телепат. Где чего когда нажимаете. 'Например такой вариант' Запускаю XCPad. Выбираю Файл->Открыть. Выбираю "ОК" или "Отмена" Выскакивает ошибка Нажимаю "Да", приложение закрывается. Опять выскакивает эта ошибка. Нажимаю "Да", приложение закрывается. В диспетчере задач процесс остается и грузит полностью одно ядро. Quote Share this post Link to post Short link Share on other sites
coJlHe4Hblu_noH4uk 141 #219178 Posted October 2, 2014 В основном совпадет Значит у них какой-то косяк, какой - не пойму. Фишка вот в чем. L в LCh должна СТРОГО совпадать с L в Lab. C - это длина вектора (а;b), в нашем случае нормализованная. (тогда почему при L=0, a=-128, b=-128 насыщенность не максимальна?) h - угол того же вектора от какой-то там точки отсчета. Можешь код свой скинуть? Откуда ты взял цифры в xml в последней колонке я не понял Посчитал через procedure LabToLCH(l, a, b: real; var lum, c, h: real); begin h := ArcTan2(b, a); if h > 0 then h := (h/PI) * 180 else h := 360 - (ABS(h)/PI) * 180; lum := l; c := SQRT(a*a + b*b); end; Только C смасштабировал. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #219181 Posted October 2, 2014 Подозреваю, что это погрешность промежуточных трансформаций. Возьми и начни варьировать RGB, и тогда увидишь что действительно L совпадает с L, но если варьировать скажем а или b то можно увидеть смешения по L у Lch. Все преобразования идут через TColor, это делфийский формат цвета $-AABBGGRR...+AABBGGRR, так вроде пишется. Например я варьирую X-параметр в Y-формате, новые цифры из Y-формат конвертируются в TColor, после этого цвет из этого формата переводится во все остальные, округляется до целых чисел и выводится в окне. Я могут все формулы собрать, глянешь. Quote Share this post Link to post Short link Share on other sites
coJlHe4Hblu_noH4uk 141 #219190 Posted October 2, 2014 (edited) Все преобразования идут через TColor Ну вот в этом и косяк, 99%. Там же 8 бит/цвет. Т.е. полная цепочка идет как Lab -> XYZ -> RGB -> (round) TColor-> XYZ -> Lab -> LCh, так? Но тогда почему L при этом из Lab'а не копируется напрямую в LCh? Я могут все формулы собрать, глянешь. Гляну. @StranikS_Scan, может это всё переписать через real? Работы немного, простой Pascal код без объектов я накидать могу на всё. И еще в чем проблема использования RGB в качестве промежуточного цвета: Наш RGB это sRGB обычно, так вот при преобразовании в него и обратно отсекается огромная часть значений, которые могут быть представлены в Lab. Вообще, внутри любого нормального цветового редактора цепочка преобразований выглядит так: ..............................HSL..................................... ................................⇅....................................... CMYK ⇆ CMY ⇆ RGB ⇆ XYZ ⇆ Lab ⇆ LCh ................................⇅....................................... ..............................HSB.................................... С учетом того, что "промежуточный" формат записи цвета должен быть как можно ближе к центру этого графа преобразований и как можно меньше должен "резать" цвета, то кандидат тут один - XYZ вместо TColor. Edited October 2, 2014 by DotNetFramework Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #219302 Posted October 2, 2014 (edited) , в делфе TColor это -$7FFFFFFF-1..$7FFFFFFF, почему ты считаешь его "узким" я не понял? Ну могу попробовать как промежуточный взять XYZ. А в твоей схеме конвертирования, какое местоположение занимает TColor? Вот весь функционал, который мне сейчас доступен: "Windows" function RGB(r, g, b: Byte): COLORREF; begin Result := (r or (g shl 8) or (b shl 16)); end; function PaletteRGB(r, g, b: Byte): COLORREF; begin Result := $02000000 or RGB(r,g,b); end; function PaletteIndex(i: Word): COLORREF; begin Result := $01000000 or i; end; function GetRValue(rgb: DWORD): Byte; begin Result := Byte(rgb); end; function GetGValue(rgb: DWORD): Byte; begin Result := Byte(rgb shr 8); end; function GetBValue(rgb: DWORD): Byte; begin Result := Byte(rgb shr 16); end; "RGBHSLUtils" unit RGBHSLUtils; interface uses Windows, Graphics, Math, Scanlines; var //set these variables to your needs, e.g. 360, 255, 255 MaxHue: integer = 360; MaxSat: integer = 255; MaxLum: integer = 255; function HSLtoRGB (H, S, L: double): TColor; function HSLRangeToRGB (H, S, L: integer): TColor; procedure RGBtoHSLRange (RGB: TColor; var H1, S1, L1 : integer); function GetHValue(AColor: TColor): integer; function GetSValue(AColor: TColor): integer; function GetLValue(AColor: TColor): integer; procedure Clamp(var Input: integer; Min, Max: integer); function HSLToRGBTriple(H, S, L : integer) : TRGBTriple; function HSLToRGBQuad(H, S, L: integer): TRGBQuad; procedure RGBTripleToHSL(RGBTriple : TRGBTriple; var h, s, l: integer); implementation function HSLtoRGB(H, S, L: double): TColor; var M1, M2: double; function HueToColorValue(Hue: double): byte; var V : double; begin if Hue < 0 then Hue := Hue + 1 else if Hue > 1 then Hue := Hue - 1; if 6 * Hue < 1 then V := M1 + (M2 - M1) * Hue * 6 else if 2 * Hue < 1 then V := M2 else if 3 * Hue < 2 then V := M1 + (M2 - M1) * (2/3 - Hue) * 6 else V := M1; Result := round (255 * V) end; var R, G, B: byte; begin if S = 0 then begin R := round (MaxLum * L); G := R; B := R end else begin if L <= 0.5 then M2 := L * (1 + S) else M2 := L + S - L * S; M1 := 2 * L - M2; R := HueToColorValue (H + 1/3); G := HueToColorValue (H); B := HueToColorValue (H - 1/3) end; Result := RGB (R, G, B) end; function HSLRangeToRGB(H, S, L : integer): TColor; begin if s > MaxSat then s := MaxSat; if s < 0 then s := 0; if l > MaxLum then l := MaxLum; if l < 0 then l := 0; Result := HSLToRGB(H / MaxHue, S / MaxSat, L / MaxLum); end; procedure RGBtoHSLRange(RGB: TColor; var H1, S1, L1 : integer); var R, G, B, D, Cmax, Cmin, h, s, l: double; begin H := h1; S := s1; L := l1; R := GetRValue (RGB) / 255; G := GetGValue (RGB) / 255; B := GetBValue (RGB) / 255; Cmax := Max (R, Max (G, B)); Cmin := Min (R, Min (G, B)); L := (Cmax + Cmin) / 2; if Cmax = Cmin then begin H := 0; S := 0; end else begin D := Cmax - Cmin; //calc L if L < 0.5 then S := D / (Cmax + Cmin) else S := D / (2 - Cmax - Cmin); //calc H if R = Cmax then H := (G - B) / D else if G = Cmax then H := 2 + (B - R) /D else H := 4 + (R - G) / D; H := H / 6; if H < 0 then H := H + 1; end; H1 := round (H * MaxHue); S1 := round (S * MaxSat); L1 := round (L * MaxLum); end; function GetHValue(AColor: TColor): integer; var d, h: integer; begin RGBToHSLRange(AColor, h, d, d); Result := h; end; function GetSValue(AColor: TColor): integer; var d, s: integer; begin RGBToHSLRange(AColor, d, s, d); Result := s; end; function GetLValue(AColor: TColor): integer; var d, l: integer; begin RGBToHSLRange(AColor, d, d, l); Result := l; end; procedure Clamp(var Input: integer; Min, Max: integer); begin if (Input < Min) then Input := Min; if (Input > Max) then Input := Max; end; function HSLToRGBTriple(H, S, L: integer): TRGBTriple; const Divisor = 255*60; var hTemp, f, LS, p, q, r: integer; begin Clamp(H, 0, MaxHue); Clamp(S, 0, MaxSat); Clamp(L, 0, MaxLum); if (S = 0) then Result := RGBToRGBTriple(L, L, L) else begin hTemp := H mod MaxHue; f := hTemp mod 60; hTemp := hTemp div 60; LS := L*S; p := L - LS div MaxLum; q := L - (LS*f) div Divisor; r := L - (LS*(60 - f)) div Divisor; case hTemp of 0: Result := RGBToRGBTriple(L, r, p); 1: Result := RGBToRGBTriple(q, L, p); 2: Result := RGBToRGBTriple(p, L, r); 3: Result := RGBToRGBTriple(p, q, L); 4: Result := RGBToRGBTriple(r, p, L); 5: Result := RGBToRGBTriple(L, p, q); else Result := RGBToRGBTriple(0, 0, 0); end; end; end; function HSLToRGBQuad(H, S, L: integer): TRGBQuad; const Divisor = 255*60; var hTemp, f, LS, p, q, r: integer; begin Clamp(H, 0, MaxHue); Clamp(S, 0, MaxSat); Clamp(L, 0, MaxLum); if (S = 0) then Result := RGBToRGBQuad(L, L, L) else begin hTemp := H mod MaxHue; f := hTemp mod 60; hTemp := hTemp div 60; LS := L*S; p := L - LS div MaxLum; q := L - (LS*f) div Divisor; r := L - (LS*(60 - f)) div Divisor; case hTemp of 0: Result := RGBToRGBQuad(L, r, p); 1: Result := RGBToRGBQuad(q, L, p); 2: Result := RGBToRGBQuad(p, L, r); 3: Result := RGBToRGBQuad(p, q, L); 4: Result := RGBToRGBQuad(r, p, L); 5: Result := RGBToRGBQuad(L, p, q); else Result := RGBToRGBQuad(0, 0, 0); end; end; end; procedure RGBTripleToHSL(RGBTriple: TRGBTriple; var h, s, l: integer); function RGBMaxValue(RGB: TRGBTriple): byte; begin Result := RGB.rgbtRed; if (Result < RGB.rgbtGreen) then Result := RGB.rgbtGreen; if (Result < RGB.rgbtBlue) then Result := RGB.rgbtBlue; end; function RGBMinValue(RGB: TRGBTriple) : byte; begin Result := RGB.rgbtRed; if (Result > RGB.rgbtGreen) then Result := RGB.rgbtGreen; if (Result > RGB.rgbtBlue) then Result := RGB.rgbtBlue; end; var Delta, Min: byte; begin L := RGBMaxValue(RGBTriple); Min := RGBMinValue(RGBTriple); Delta := L-Min; if (L = Min) then begin H := 0; S := 0; end else begin S := MulDiv(Delta, 255, L); with RGBTriple do begin if (rgbtRed = L) then H := MulDiv(60, rgbtGreen-rgbtBlue, Delta) else if (rgbtGreen = L) then H := MulDiv(60, rgbtBlue-rgbtRed, Delta) + 120 else if (rgbtBlue = L) then H := MulDiv(60, rgbtRed-rgbtGreen, Delta) + 240; if (H < 0) then H := H + 360; end; end; end; end. "RGBHSVUtils" unit RGBHSVUtils; interface uses Windows, SysUtils, Classes, Graphics, Math, Scanlines; procedure Clamp(var Input: integer; Min, Max: integer); function RGBtoRGBTriple(R, G, B: byte): TRGBTriple; function RGBtoRGBQuad(R, G, B: byte): TRGBQuad; function RGBTripleToColor(Triple: TRGBTriple): TColor; procedure RGBToHSV(R,G,B: integer; var H,S,V: integer); function HSVtoRGBTriple(H, S, V: integer): TRGBTriple; function HSVtoRGBQuad(H, S, V: integer): TRGBQuad; function HSVtoColor(H, S, V: integer): TColor; function GetHValue(Color: TColor): integer; function GetVValue(Color: TColor): integer; function GetSValue(Color: TColor): integer; implementation procedure Clamp(var Input: integer; Min, Max: integer); begin if Input < Min then Input := Min; if Input > Max then Input := Max; end; function RGBtoRGBTriple(R, G, B: byte): TRGBTriple; begin with Result do begin rgbtRed := R; rgbtGreen := G; rgbtBlue := B; end end; function RGBtoRGBQuad(R, G, B: byte): TRGBQuad; begin with Result do begin rgbRed := R; rgbGreen := G; rgbBlue := B; rgbReserved := 0; end end; function RGBTripleToColor(Triple: TRGBTriple): TColor; begin Result := TColor(RGB(Triple.rgbtRed, Triple.rgbtGreen, Triple.rgbtBlue)); end; procedure RGBToHSV(R, G, B: integer; var H, S, V: integer); var Delta, Min, H1, S1: real; begin h1 := h; s1 := s; Min := MinIntValue([R, G, B]); V := MaxIntValue([R, G, B]); Delta := V - Min; if V = 0.0 then S1 := 0 else S1 := Delta / V; if S1 = 0.0 then H1 := 0 else begin if R = V then H1 := 60.0 * (G - B) / Delta else if G = V then H1 := 120.0 + 60.0 * (B - R) / Delta else if B = V then H1 := 240.0 + 60.0 * (R - G) / Delta; if H1 < 0.0 then H1 := H1 + 360.0; end; h := round(h1); s := round(s1*255); end; function HSVtoRGBTriple(H, S, V: integer): TRGBTriple; const divisor: integer = 255*60; var f, hTemp, p, q, t, VS: integer; begin if H > 360 then H := H - 360; if H < 0 then H := H + 360; if s = 0 then Result := RGBtoRGBTriple(V, V, V) else begin if H = 360 then hTemp := 0 else hTemp := H; f := hTemp mod 60; hTemp := hTemp div 60; VS := V*S; p := V - VS div 255; q := V - (VS*f) div divisor; t := V - (VS*(60 - f)) div divisor; case hTemp of 0: Result := RGBtoRGBTriple(V, t, p); 1: Result := RGBtoRGBTriple(q, V, p); 2: Result := RGBtoRGBTriple(p, V, t); 3: Result := RGBtoRGBTriple(p, q, V); 4: Result := RGBtoRGBTriple(t, p, V); 5: Result := RGBtoRGBTriple(V, p, q); else Result := RGBtoRGBTriple(0,0,0) end; end; end; function HSVtoRGBQuad(H, S, V: integer): TRGBQuad; const divisor: integer = 255*60; var f, hTemp, p, q, t, VS: integer; begin if H > 360 then H := H - 360; if H < 0 then H := H + 360; if s = 0 then Result := RGBtoRGBQuad(V, V, V) else begin if H = 360 then hTemp := 0 else hTemp := H; f := hTemp mod 60; hTemp := hTemp div 60; VS := V*S; p := V - VS div 255; q := V - (VS*f) div divisor; t := V - (VS*(60 - f)) div divisor; case hTemp of 0: Result := RGBtoRGBQuad(V, t, p); 1: Result := RGBtoRGBQuad(q, V, p); 2: Result := RGBtoRGBQuad(p, V, t); 3: Result := RGBtoRGBQuad(p, q, V); 4: Result := RGBtoRGBQuad(t, p, V); 5: Result := RGBtoRGBQuad(V, p, q); else Result := RGBtoRGBQuad(0,0,0) end; end; end; function HSVtoColor(H, S, V: integer): TColor; begin Result := RGBTripleToColor(HSVtoRGBTriple(H, S, V)); end; function GetHValue(Color: TColor): integer; var s, v: integer; begin RGBToHSV(GetRValue(Color), GetGValue(Color), GetBValue(Color), Result, s, v); end; function GetSValue(Color: TColor): integer; var h, v: integer; begin RGBToHSV(GetRValue(Color), GetGValue(Color), GetBValue(Color), h, Result, v); end; function GetVValue(Color: TColor): integer; var h, s: integer; begin RGBToHSV(GetRValue(Color), GetGValue(Color), GetBValue(Color), h, s, Result); end; end. "RGBCIEUtils" unit RGBCIEUtils; interface uses SysUtils, Windows, Graphics, Math; const {// Observer= 2°, Illuminant= D65 - Daylignt ref_X = 95.047; ref_Z = 108.883; // Observer= 10°, Illuminant= D65 - Daylight ref_X = 94.811; ref_Z = 35.2; // Observer= 2°, Illuminant= A - Incadescent ref_X = 109.850; ref_Z = 35.585; // Observer= 10°, Illuminant= A - Incadescent ref_X = 111.144; ref_Z = 35.2; // Observer= 2°, Illuminant= C ref_X = 98.074; ref_Z = 118.232; // Observer= 10°, Illuminant= C ref_X = 97.285; ref_Z = 116.145; } // Observer= 2°, Illuminant= D50 ref_X = 96.422; ref_Z = 82.521;{ // Observer= 10°, Illuminant= D50 - Photoshop ref_X = 96.72; ref_Z = 81.427; } {// Observer= 2°, Illuminant= D55 ref_X = 95.682; ref_Z = 92.149; // Observer= 10°, Illuminant= D55 ref_X = 95.799; ref_Z = 90.926; // Observer= 2°, Illuminant= D75 ref_X = 94.972; ref_Z = 122.638; // Observer= 10°, Illuminant= D75 ref_X = 94.416; ref_Z = 12.641; // Observer= 2°, Illuminant= F2 - Fluorescent ref_X = 99.187; ref_Z = 67.395; // Observer= 10°, Illuminant= F2 - Fluorescent ref_X = 103.28; ref_Z = 69.026; // Observer= 2°, Illuminant= F7 ref_X = 95.044; ref_Z = 108.755; // Observer= 10°, Illuminant= F7 ref_X = 95.792; ref_Z = 107.678; // Observer= 2°, Illuminant= F11 ref_X = 100.966; ref_Z = 64.370; // Observer= 10°, Illuminant= F11 ref_X = 103.866; ref_Z = 65.627; } type xyz = record x: real; y: real; z: real; end; function LabToXYZ(l, a, b: real): xyz; function XYZToRGB(space: xyz): TColor; function LabToRGB(l, a, b: real): TColor; function RGBToXYZ(c: TColor): xyz; procedure RGBToLab(clr: TColor; var l, a, b: real); procedure XYZToLab(space: xyz; var l, a, b: real); procedure LCHToLab(lum, c, h: real; var l, a, b: real); procedure LabToLCH(l, a, b: real; var lum, c, h: real); function LCHToRGB(l, c, h: real): TColor; procedure RGBToLCH(clr: TColor; var l, c, h: real); function GetCIEXValue(c: TColor): real; function GetCIEYValue(c: TColor): real; function GetCIEZValue(c: TColor): real; function GetCIELValue(c: TColor): real; function GetCIEAValue(c: TColor): real; function GetCIEBValue(c: TColor): real; function GetCIECValue(c: TColor): real; function GetCIEHValue(c: TColor): real; implementation function LabToXYZ(l, a, b: real): xyz; var x, y, z: real; begin y := (l + 16)/116; x := a/500 + y; z := y - b/200; if y > 0.2069 then y := IntPower(y, 3) else y := (y - 0.138)/7.787; if x > 0.2069 then x := IntPower(x, 3) else x := (x - 0.138)/7.787; if z > 0.2069 then z := IntPower(z, 3) else z := (z - 0.138)/7.787; Result.x := ref_X * x; Result.y := 100 * y; Result.z := ref_Z * z; end; function XYZToRGB(space: xyz): TColor; var r, g, b, x, y, z: real; begin x := space.x/100; y := space.y/100; z := space.z/100; r := x * 3.2406 + y * (-1.5372) + z * (-0.49); g := x * (-0.969) + y * 1.8758 + z * 0.0415; b := x * 0.0557 + y * (-0.2040) + z * 1.0570; if r > 0.00313 then r := 1.055 * Power(r, 1/2.4) - 0.055 else r := 12.92 * r; if g > 0.00313 then g := 1.055 * Power(g, 1/2.4) - 0.055 else g := 12.92 * g; if b > 0.00313 then b := 1.055 * Power(b, 1/2.4) - 0.055 else b := 12.92 * b; if r < 0 then r := 0; if r > 1 then r := 1; if g < 0 then g := 0; if g > 1 then g := 1; if b < 0 then b := 0; if b > 1 then b := 1; Result := RGB(Round(r*255), Round(g*255), Round(b*255)); end; function LabToRGB(l, a, b: real): TColor; begin Result := XYZToRGB(LabToXYZ(l, a, b)); end; function RGBToXYZ(c: TColor): xyz; var r, g, b: real; begin r := GetRValue(c)/255; g := GetGValue(c)/255; b := GetBValue(c)/255; if r > 0.04045 then r := Power((r + 0.055)/1.055, 2.4) else r := r/12.92; if g > 0.04045 then g := Power((g + 0.055)/1.055, 2.4) else g := g/12.92; if b > 0.04045 then b := Power((b + 0.055)/1.055, 2.4) else b := b/12.92; r := r * 100; g := g * 100; b := b * 100; // Observer= 2°, Illuminant= D65 Result.x := r * 0.4124 + g * 0.3576 + b * 0.1805; Result.y := r * 0.2126 + g * 0.7152 + b * 0.0722; Result.z := r * 0.0193 + g * 0.1192 + b * 0.9505; end; procedure XYZToLab(space: xyz; var l, a, b: real); var x, y, z: real; begin x := space.x/ref_X; y := space.y/100; z := space.z/ref_Z; if x > 0.008856 then x := Power(x, 1/3) else x := (7.787*x) + 0.138; if y > 0.008856 then y := Power(y, 1/3) else y := (7.787*y) + 0.138; if z > 0.008856 then z := Power(z, 1/3) else z := (7.787*z) + 0.138; l := (116*y) - 16; a := 500 * (x - y); b := 200 * (y - z); if l > 100 then l := 100; if l < 0 then l := 0; if a < -128 then a := -128; if a > 127 then a := 127; if b < -128 then b := -128; if b > 127 then b := 127; end; procedure RGBToLab(clr: TColor; var l, a, b: real); var s: xyz; begin s := RGBToXYZ(clr); XYZToLab(s, l, a, b); end; procedure LCHToLab(lum, c, h: real; var l, a, b: real); begin l := lum; a := cos(DegToRad(h)) * c; b := sin(DegToRad(h)) * c; end; procedure LabToLCH(l, a, b: real; var lum, c, h: real); begin h := ArcTan2(b, a); if h > 0 then h := (h/PI) * 180 else h := 360 - (ABS(h)/PI) * 180; if h = 360 then //************************ STRANIKS_SCAN ***************** 02/10/2014 h := 0; lum := l; c := SQRT(a*a + b*b); end; procedure RGBToLCH(clr: TColor; var l, c, h: real); var a, b: real; begin RGBToLab(clr, l, a, b); LabToLCH(l, a, b, l, c, h); end; function LCHToRGB(l, c, h: real): TColor; var lum, a, b: real; begin LCHToLab(l, c, h, lum, a, b); Result := LabToRGB(lum, a, b); end; function GetCIEXValue(c: TColor): real; var d: xyz; begin d := RGBToXYZ(c); Result := d.x; end; function GetCIEYValue(c: TColor): real; var d: xyz; begin d := RGBToXYZ(c); Result := d.y; end; function GetCIEZValue(c: TColor): real; var d: xyz; begin d := RGBToXYZ(c); Result := d.z; end; function GetCIELValue(c: TColor): real; var d: real; begin XYZToLab(RGBToXYZ(c), Result, d, d); end; function GetCIEAValue(c: TColor): real; var d: real; begin XYZToLab(RGBToXYZ(c), d, Result, d); end; function GetCIEBValue(c: TColor): real; var d: real; begin XYZToLab(RGBToXYZ(c), d, d, Result); end; function GetCIECValue(c: TColor): real; var d: real; begin RGBToLCH(c, d, Result, d); end; function GetCIEHValue(c: TColor): real; var d: real; begin RGBToLCH(c, d, d, Result); end; end. "RGBCMYKUtils" unit RGBCMYKUtils; //StranikS_Scan Edition 30/10/2013 interface uses Windows, Graphics, Math; //function CMYtoTColor(C, M, Y: integer): TColor; //procedure RGBtoCMY(clr: TColor; var C, M, Y: integer); function CMYKToTColor (C, M, Y, K: integer): TColor; procedure ColorToCMYK(clr: TColor; var C, M, Y, K: integer); function GetCValue(c: TColor): integer; function GetMValue(c: TColor): integer; function GetYValue(c: TColor): integer; function GetKValue(c: TColor): integer; implementation {function CMYtoTColor(C, M, Y: integer): TColor; begin Result := RGB(255 - C, 255 - M, 255 - Y); end;} {procedure RGBtoCMY(clr: TColor; var C, M, Y: integer); begin C := 255 - GetRValue(clr); M := 255 - GetGValue(clr); Y := 255 - GetBValue(clr); end;} function CMYKToTColor (C, M, Y, K: integer): TColor; begin { Result := RGB(255 - (C + K), 255 - (M + K), 255 - (Y + K)); } Result := RGB(Round(255*(1-C/100)*(1-K/100)),Round(255*(1-M/100)*(1-K/100)),Round(255*(1-Y/100)*(1-K/100))); end; procedure ColorToCMYK(clr: TColor; var C, M, Y, K: integer); var _C, _M, _Y, _K: Real; begin { C := 255 - GetRValue(clr); M := 255 - GetGValue(clr); Y := 255 - GetBValue(clr); K := MinIntValue([C, M, Y]); C := C - K; M := M - K; Y := Y - K; } _C:=1-GetRValue(clr)/255; _Y:=1-GetGValue(clr)/255; _M:=1-GetBValue(clr)/255; _K:=MinValue([_C,_Y,_M]); if _K=1 then begin _C:=0; _M:=0; _Y:=0; end else begin _C:=(_C-_K)/(1-_K); _M:=(_M-_K)/(1-_K); _Y:=(_Y-_K)/(1-_K); end; C:=Round(100*_C); M:=Round(100*_M); Y:=Round(100*_Y); K:=Round(100*_K); end; function GetCValue(c: TColor): integer; var d: integer; begin ColorToCMYK(c, Result, d, d, d); end; function GetMValue(c: TColor): integer; var d: integer; begin ColorToCMYK(c, d, Result, d, d); end; function GetYValue(c: TColor): integer; var d: integer; begin ColorToCMYK(c, d, d, Result, d); end; function GetKValue(c: TColor): integer; var d: integer; begin ColorToCMYK(c, d, d, d, Result); end; end. "HTMLColors" unit HTMLColors; interface {$I mxs.inc} uses SysUtils, Windows, Graphics{$IFDEF DELPHI_6_UP}, Variants{$ENDIF}; const SPECIAL_COUNT = 140; WEBSAFE_COUNT = 216; SYSTEM_COUNT = 28; BASIC_COUNT = 16; SPECIAL_HEX: array [0..139] of string = ('000000', 'FAEBD7', '00FFFF', '7FFFD4', 'F0FFFF', 'F5F5DC', 'FFE4C4', 'F0F8FF', 'FFEBCD', '0000FF', '8A2BE2', 'A52A2A', 'DEB887', '5F9EA0', '7FFF00', 'D2691E', 'FF7F50', '6495ED', 'FFF8DC', 'DC143C', '00FFFF', '00008B', '008B8B', 'B8860B', 'A9A9A9', '006400', 'BDB76B', '8B008B', '556B2F', 'FF8C00', '9932CC', '8B0000', 'E9967A', '8FBC8B', '483D8B', '2F4F4F', '00CED1', '9400D3', 'FF1493', '00BFFF', '696969', '1E90FF', 'B22222', 'FFFAF0', '228B22', 'FF00FF', 'DCDCDC', 'F8F8FF', 'FFD700', 'DAA520', '808080', '008000', 'ADFF2F', 'F0FFF0', 'FF69B4', 'CD5C5C', '4B0082', 'FFFFF0', 'F0E68C', 'E6E6FA', 'FFF0F5', '7CFC00', 'FFFACD', 'ADD8E6', 'F08080', 'E0FFFF', 'FAFAD2', '90EE90', 'D3D3D3', 'FFB6C1', 'FFA07A', '20B2AA', '87CEFA', '778899', 'B0C4DE', 'FFFFE0', '00FF00', '32CD32', 'FAF0E6', 'FF00FF', '800000', '66CDAA', '0000CD', 'BA55D3', '9370DB', '3CB371', '7B68EE', '00FA9A', '48D1CC', 'C71585', '191970', 'F5FFFA', 'FFE4E1', 'FFE4B5', 'FFDEAD', '000080', 'FDF5E6', '808000', '6B8E23', 'FFA500', 'FF4500', 'DA70D6', 'EEE8AA', '98FB98', 'AFEEEE', 'DB7093', 'FFEFD5', 'FFDAB9', 'CD853F', 'FFC0CB', 'DDA0DD', 'B0E0E6', '800080', 'FF0000', 'BC8F8F', '4169E1', '8B4513', 'FA8072', 'F4A460', '2E8B57', 'FFF5EE', 'A0522D', 'C0C0C0', '87CEEB', '6A5ACD', '708090', 'FFFAFA', '00FF7F', '4682B4', 'D2B48C', '008080', 'D8BFD8', 'FF6347', '40E0D0', 'EE82EE', 'F5DEB3', 'FFFFFF', 'F5F5F5', 'FFFF00', '9ACD32'); SPECIAL_NAMES: array [0..139] of string = ('black', 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige', 'bisque', 'aliceblue', 'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflower', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'fuchsia', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray', 'green', 'greenyellow', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgreen', 'lightgray', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightsteelblue', 'lightyellow', 'lime', 'limegreen', 'linen', 'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'navy', 'oldlace', 'olive', 'olivedrab', 'orange', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'purple', 'red', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'silver', 'skyblue', 'slateblue', 'slategray', 'snow', 'springgreen', 'steelblue', 'tan', 'teal', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'white', 'whitesmoke', 'yellow', 'yellowgreen'); WEBSAFE_HEX: array [0..215] of string = ('000000' ,'000033' ,'000066' ,'000099' ,'0000cc' ,'0000ff', '003300' ,'003333' ,'003366' ,'003399' ,'0033cc' ,'0033ff', '006600' ,'006633' ,'006666' ,'006699' ,'0066cc' ,'0066ff', '009900' ,'009933' ,'009966' ,'009999' ,'0099cc' ,'0099ff', '00cc00' ,'00cc33' ,'00cc66' ,'00cc99' ,'00cccc' ,'00ccff', '00ff00' ,'00ff33' ,'00ff66' ,'00ff99' ,'00ffcc' ,'00ffff', '330000' ,'330033' ,'330066' ,'330099' ,'3300cc' ,'3300ff', '333300' ,'333333' ,'333366' ,'333399' ,'3333cc' ,'3333ff', '336600' ,'336633' ,'336666' ,'336699' ,'3366cc' ,'3366ff', '339900' ,'339933' ,'339966' ,'339999' ,'3399cc' ,'3399ff', '33cc00' ,'33cc33' ,'33cc66' ,'33cc99' ,'33cccc' ,'33ccff', '33ff00' ,'33ff33' ,'33ff66' ,'33ff99' ,'33ffcc' ,'33ffff', '660000' ,'660033' ,'660066' ,'660099' ,'6600cc' ,'6600ff', '663300' ,'663333' ,'663366' ,'663399' ,'6633cc' ,'6633ff', '666600' ,'666633' ,'666666' ,'666699' ,'6666cc' ,'6666ff', '669900' ,'669933' ,'669966' ,'669999' ,'6699cc' ,'6699ff', '66cc00' ,'66cc33' ,'66cc66' ,'66cc99' ,'66cccc' ,'66ccff', '66ff00' ,'66ff33' ,'66ff66' ,'66ff99' ,'66ffcc' ,'66ffff', '990000' ,'990033' ,'990066' ,'990099' ,'9900cc' ,'9900ff', '993300' ,'993333' ,'993366' ,'993399' ,'9933cc' ,'9933ff', '996600' ,'996633' ,'996666' ,'996699' ,'9966cc' ,'9966ff', '999900' ,'999933' ,'999966' ,'999999' ,'9999cc' ,'9999ff', '99cc00' ,'99cc33' ,'99cc66' ,'99cc99' ,'99cccc' ,'99ccff', '99ff00' ,'99ff33' ,'99ff66' ,'99ff99' ,'99ffcc' ,'99ffff', 'cc0000' ,'cc0033' ,'cc0066' ,'cc0099' ,'cc00cc' ,'cc00ff', 'cc3300' ,'cc3333' ,'cc3366' ,'cc3399' ,'cc33cc' ,'cc33ff', 'cc6600' ,'cc6633' ,'cc6666' ,'cc6699' ,'cc66cc' ,'cc66ff', 'cc9900' ,'cc9933' ,'cc9966' ,'cc9999' ,'cc99cc' ,'cc99ff', 'cccc00' ,'cccc33' ,'cccc66' ,'cccc99' ,'cccccc' ,'ccccff', 'ccff00' ,'ccff33' ,'CCFF66' ,'ccff99' ,'ccffcc' ,'ccffff', 'ff0000' ,'ff0033' ,'ff0066' ,'ff0099' ,'ff00cc' ,'ff00ff', 'ff3300' ,'ff3333' ,'ff3366' ,'ff3399' ,'ff33cc' ,'ff33ff', 'ff6600' ,'ff6633' ,'ff6666' ,'ff6699' ,'ff66cc' ,'ff66ff', 'ff9900' ,'ff9933' ,'ff9966' ,'ff9999' ,'ff99cc' ,'ff99ff', 'ffcc00' ,'ffcc33' ,'ffcc66' ,'ffcc99' ,'ffcccc' ,'ffccff', 'ffff00' ,'ffff33' ,'ffff66' ,'ffff99' ,'ffffcc' ,'ffffff'); SYSTEM_VALUES: array [0..27] of TColor = (clActiveBorder, clActiveCaption, clAppWorkspace, clBackground, clBtnFace, clBtnHighlight, clBtnShadow, clBtnText, clCaptionText, clGrayText, clHighlight, clHighlightText, clInactiveBorder, clInactiveCaption, clInactiveCaptionText, clInfoBk, clInfoText, clMenu, clMenuText, clScrollbar, cl3dDkShadow, cl3dLight, clBtnHighlight, clActiveBorder, clBtnShadow, clWindow, clWindowFrame, clWindowText); SYSTEM_NAMES: array [0..27] of string = ('activeborder', 'activecaption', 'appworkspace', 'background', 'buttonface', 'buttonhighlight', 'buttonshadow', 'buttontext', 'captiontext', 'graytext', 'highlight', 'highlighttext', 'inactiveborder', 'inactivecaption', 'inactivecaptiontext', 'infobackground', 'infotext', 'menu', 'menutext', 'scrollbar', 'threeddarkshadow', 'threedface', 'threedhighlight', 'threedlightshadow', 'threedshadow', 'window', 'windowframe', 'windowtext'); BASIC_VALUES: array [0..15] of TColor = (clBlack, clAqua, clBlue, clFuchsia, clGray, clGreen, clLime, clMaroon, clNavy, clOlive, clPurple, clRed, clSilver, clTeal, clWhite, clYellow); BASIC_NAMES: array [0..15] of string = ('black', 'aqua', 'blue', 'fuchsia', 'gray', 'green', 'lime', 'maroon', 'navy', 'olive', 'purple', 'red', 'silver', 'teal', 'white', 'yellow'); procedure MakeIntoHex(var s: string); function IsMember(a: array of string; n: integer; s: string): boolean; function IsSpecialColor(s: string): boolean; function FormatHexColor(S: string): string; function ColorToHex(Color: TColor): string; function HexToTColor(s: OleVariant): TColor; function GetHexFromName(s: string): string; function GetValueFromName(s: string): TColor; function IsWebSafe(s: string): boolean; overload; function IsWebSafe(c: TColor): boolean; overload; function GetWebSafe(C: TColor): TColor; implementation var WS: array [0..255] of byte; //------------------------------------------------------------------------------ //checks membership of a string array function IsMember(a: array of string; n: integer; s: string): boolean; var i: integer; begin Result := false; for i := 0 to n - 1 do if SameText(s, a[i]) then Result := true; end; //------------------------------------------------------------------------------ //checks if the color's nam was used instead of hex function IsSpecialColor(s: string): boolean; begin Result := IsMember(BASIC_NAMES, BASIC_COUNT, s) or IsMember(SPECIAL_NAMES, SPECIAL_COUNT, s) or IsMember(SYSTEM_NAMES, SYSTEM_COUNT, s); end; //------------------------------------------------------------------------------ //is hex was used then remove the wrong characters procedure MakeIntoHex(var s: string); var i: integer; begin if s <> '' then for i := 1 to Length(s) do if not (s[i] in ['0'..'9', 'A'..'F', 'a'..'f']) then s[i] := '0'; end; //------------------------------------------------------------------------------ //formats entered text into a true hex value function FormatHexColor(S: string): string; var c: string; i: integer; begin c := ''; if not IsSpecialColor(s) then begin if (s <> '') and (s[1] = '#') then Delete(s, 1, 1); if s <> '' then begin MakeIntoHex(c); if Length(c) = 6 then Result := c else begin if Length(c) > 6 then c := Copy(c, 1, 6); if Length(c) < 6 then for i := 0 to 6 - Length(c) - 1 do c := '0' + c; Result := c; end; end else Result := '000000'; end else Result := s; end; //------------------------------------------------------------------------------ //gets a hex value from a color name from special colors function GetHexFromName(s: string): string; var i, k: integer; begin k := 0; for i := 0 to SPECIAL_COUNT - 1 do if SameText(s, SPECIAL_NAMES[i]) then begin k := i; Break; end; Result := SPECIAL_HEX[k]; end; //------------------------------------------------------------------------------ // gets a TColor value from a color name from basic or system colors function GetValueFromName(s: string): TColor; var i, k: integer; begin k := 0; s := LowerCase(s); if IsMember(BASIC_NAMES, BASIC_COUNT, s) then begin for i := 0 to BASIC_COUNT - 1 do if SameText(s, BASIC_NAMES[i]) then begin k := i; Break; end; Result := BASIC_VALUES[k]; end else if IsMember(SYSTEM_NAMES, SYSTEM_COUNT, s) then begin for i := 0 to SYSTEM_COUNT - 1 do if SameText(s, SYSTEM_NAMES[i]) then begin k := i; Break; end; Result := SYSTEM_VALUES[k]; end else Result := clNone; end; //------------------------------------------------------------------------------ //converts a TColor value to a hex value function ColorToHex(Color: TColor): string; begin if Color <> $ then Result := IntToHex(GetRValue(Color), 2) + IntToHex(GetGValue(Color), 2) + IntToHex(GetBValue(Color), 2) else Result := '000000'; end; //------------------------------------------------------------------------------ //converts a hex value to a TColor function HexToTColor(s: OleVariant): TColor; begin if s <> null then begin if not IsSpecialColor(s) then begin s := FormatHexColor(s); if s <> '' then Result := RGB(StrToInt('$'+Copy(S, 1, 2)), StrToInt('$'+Copy(S, 3, 2)), StrToInt('$'+Copy(S, 5, 2))) else Result := clNone; end else if IsMember(SPECIAL_NAMES, SPECIAL_COUNT, s) then begin s := GetHexFromName(s); Result := RGB(StrToInt('$'+Copy(S, 1, 2)), StrToInt('$'+Copy(S, 3, 2)), StrToInt('$'+Copy(S, 5, 2))); end else Result := GetValueFromName(s); end else Result := clNone; end; //------------------------------------------------------------------------------ //checks if a hex value belongs to the websafe palette function IsWebSafe(s: string): boolean; begin s := FormatHexColor(s); Result := IsMember(WEBSAFE_HEX, WEBSAFE_COUNT, s); end; //------------------------------------------------------------------------------ //checks if a color belongs to the websafe palette function IsWebSafe(c: TColor): boolean; var s: string; begin s := ColorToHex(c); Result := IsMember(WEBSAFE_HEX, WEBSAFE_COUNT, s); end; //------------------------------------------------------------------------------ //initializes the websafe comparison array procedure InitializeWS; var i: integer; begin for i := 0 to 255 do WS[I] := ((i + $19) div $33) * $33; end; //------------------------------------------------------------------------------ //returns the closest web safe color to the one given function GetWebSafe(C: TColor): TColor; begin Result := RGB(WS[GetRValue(C)], WS[GetGValue(C)], WS[GetBValue(C)]); end; //------------------------------------------------------------------------------ initialization InitializeWS; end. Edited October 2, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
coJlHe4Hblu_noH4uk 141 #219322 Posted October 2, 2014 какое местоположение занимает TColor только для хранения значений, которые RGB. Объясню почему. Красный в RGB это ff0000. Но в природе есть "еще более красный", но для красного 255 - и потолок, краснее не сделаешь.Но в пространствах Lab, LCh, XYZ он есть. При этом, чтобы в RGB у тебя не было чисел больше 255, есть код: if r < 0 then r := 0; if r > 1 then r := 1; if g < 0 then g := 0; if g > 1 then g := 1; if b < 0 then b := 0; if b > 1 then b := 1; Т.е. он обрезает выходящие за диапазон значения. А обрезать их можно только в случае вывода на экран циферок или при рисовании цвета. А при преобразовании Lab в LCh - там RGB вообще не нужен в расчетах. Вообще, допустим я изменил L, C или h - при этом остальные поля должны обновиться в следующем порядке: Lab. из Lab'а мы считаем RGB. из RGB - HSB/HSV/HSL/CMY/CMYK в любом порядке. Но если после этого я тронул RGB, то "волна" расчетов должна идти от него. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #219330 Posted October 2, 2014 только для хранения значений, которые RGB. Объясню почему. Красный в RGB это ff0000. Но в природе есть "еще более красный", но для красного 255 - и потолок, краснее не сделаешь. Но в пространствах Lab, LCh, XYZ он есть. Расширение цветовых пространств я знаю. Я просто не понял тебя в первый раз, подумал, что TColor имеет отличия от RGB, в то время как это одно и тоже пространство же. Короче разобрались. По XYZ - ты прав его надо юзать как базовое пространство. А все остальные уже от него по схеме: ..............................HSL.....................................................................⇅.......................................CMYK ⇆ CMY ⇆ RGB ⇆ XYZ ⇆ Lab ⇆ LCh................................⇅.....................................................................HSB.................................... Quote Share this post Link to post Short link Share on other sites
ktulho 5,791 #219685 Posted October 3, 2014 (edited) Ошибка. Если конфиг загружать через файл "xvm.xc", находящийся в папке "Config", то при выборе в меню "Обновлять дату в конфиге" выскакивает ошибка. При загрузке через файл "@xvm.xc" - всё нормально. XCPad.exe_error.log И ещё, Scroll в окне редактора, если программа не развернута на весь экран, масштабируется как будто программа развернута на весь экран. К посту №285. Та же самая ошибка выскакивает при нажатие "ОК" или "Отмена" в окне поиска "Найти...". Может у меня в операционной системе чего то не хватает? Edited October 3, 2014 by ktulho Quote Share this post Link to post Short link Share on other sites
ktulho 5,791 #220305 Posted October 6, 2014 (edited) К постам 285 и 292. Нашел причину ошибки. В файле "hangar.xc" не было строки: "comments": ${"comments.xc":"comments"}. (В той ночной сборке XVM, этого файла еще не было.) И ещё, Scroll в окне редактора, если программа не развернута на весь экран, масштабируется как будто программа развернута на весь экран. А это без изменений. Пожелание. Добавить в валидацию кода проверку на " ,} " (вроде такого сочетания знаков не может быть). При загрузке всего конфига, не открываются файлы "markers****.xc". Возможно из-за разделения сниппетов на файлы. Прилагаю конфиг. My.rar P.S. У меня еще появилась пара "руководств", как получить окно с ошибкой, если надо, опишу. Edited October 6, 2014 by ktulho Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #220319 Posted October 6, 2014 (edited) У меня еще появилась пара "руководств", как получить окно с Пиши, буду смотреть. " ,} " Во многих парсерах это не ошибка, в парсере, который XVM юзает, это не считается ошибкой. Можно еще раз проверить. Edited October 6, 2014 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
ktulho 5,791 #220332 Posted October 6, 2014 (edited) I. Ошибка. 1) Если в файл "login.xc" из буфера обмена вставить несколько строк с заменой нескольких строк, выскакивает ошибка. 2) Если просто вставить или с заменой одной строки, то все нормально. 3) Если первый пункт делать после второго, то тоже все нормально. II. Ошибка. Если конфиг загрузить через файл "@xvm.xc", то при попытки открыть через меню другой файл вылетает ошибка. С другими файлами проблем нет. Во многих парсерах это не ошибка, в парсере, который XVM юзает, это не считается ошибкой. Можно еще раз проверить. Считается ошибкой. Поставил запятую в конце файла "hitLog .xc". Вот что получилось: P.S. Не считается ошибкой, если " ,} " в тестовой строке. Edited October 6, 2014 by ktulho Quote Share this post Link to post Short link Share on other sites
STR853 2 #221205 Posted October 9, 2014 Крутой редактор)) ОООчень понравилась подсветка цвета линией этого же цвета, очень круто и удобно, не нужно шариться по редакторам постоянно и смотреть что же это за цвет)) Пару пожеланий имеется: 1. Добавить во вкладку "Вид" такое дело, как "Перенос строк". Не знаю, может уже предлагалось, может нет... 2. И очень удобно было бы следующее (сейчас постараюсь объяснить): мы имеем 2 окна - в одном части конфига, в другом, собственно, сам конфиг. А если конфиг длинный, а нужно перемотать колесом прокрутки мышки вниз, то курсор нужно переместить окно с конфигом, и ОБЯЗАТЕЛЬНО кликнуть ЛКМ на окне в котором конфиг. Так вот хотелось бы чтобы не нужно было кликать на окно, что бы оно стало активным к прокрутке, а при перемещении курсора в любое окно без посредства клика ЛКМ оно становилось активным к прокрутке. Надеюсь понятно предоставил свои мысли) Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #221247 Posted October 9, 2014 1. Добавить во вкладку "Вид" такое дело, как "Перенос строк". Не знаю, может уже предлагалось, может нет... Перенос есть, ищи его в главном меню. 2. мы имеем 2 окна - в одном части конфига, в другом, собственно, сам конфиг. А если конфиг длинный, а нужно перемотать колесом прокрутки мышки вниз, то курсор нужно переместить окно с конфигом, и ОБЯЗАТЕЛЬНО кликнуть ЛКМ на окне в котором конфиг. Так вот хотелось бы чтобы не нужно было кликать на окно, что бы оно стало активным к прокрутке, а при перемещении курсора в любое окно без посредства клика ЛКМ оно становилось активным к прокрутке. Надеюсь понятно предоставил свои мысли) Короче над каким редактором оказывается курсор, тот редактор и делаем активным. Ладно гляну такой вариант. 1 Quote Share this post Link to post Short link Share on other sites
STR853 2 #221425 Posted October 10, 2014 Перенос есть, ищи его в главном меню C трудом, но нашел)) Вид -> Редактор -> Перенос длинных строк. Спасибо Короче над каким редактором оказывается курсор, тот редактор и делаем активным. Ладно гляну такой вариант. Во! Да да да, в двух словах это оно и есть) 1 Quote Share this post Link to post Short link Share on other sites
Evgeniy_4 0 #222226 Posted October 13, 2014 (edited) Помогите пожалуйста. Как сделать через XCPad чтоб было как на картинках. Маркеры над танками 2-й столбик после названия танка - его уровень. 5-й xvn8 и количество боёв Edited October 13, 2014 by Evgeniy_4 Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #222230 Posted October 13, 2014 @Evgeniy_4, вы не в ту тему пишите. Вам нужна тема Quote Share this post Link to post Short link Share on other sites