标签: freepascal

什么是操作JPEG元数据的最佳库?

我正在寻找一个可以读写JPEG图像元数据的库.例如,如果我想嵌入并回读与jpeg图像相关的简短描述或故事,在图像文件本身中,您会推荐哪些开发库?

我对于什么语言(这是一个新项目)并不太感兴趣,尽管我已经为我熟悉的语言标记了这个问题(但我也会考虑其他语言).最好是相对跨平台的东西(mac/linux/win),比如Java,FreePascal/Lazarus,C++,Objective-C等(老实说我不熟悉跨平台,所以不知道是否是C#是一种可能性 - 除了Java或.NET等更受欢迎的产品之外,最好不要求安装任何特定的框架.

java jpeg cross-platform metadata freepascal

3
推荐指数
1
解决办法
3652
查看次数

Pascal - 读/读功能杂质?

我真的很感兴趣 - 为什么你需要放

readln;
Run Code Online (Sandbox Code Playgroud)

从键盘读取一些值到变量后的行?例如,

repeat
writeln('Make your choise');
read(CH);

if (CH = '1') then begin
writeln('1');
end;

{ ... }
until CH = 'q';
Run Code Online (Sandbox Code Playgroud)

如果您运行以下代码,并在键盘上按"1",您会得到类似的输出

1
Make your choise
Make your choise
Make your choise
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你添加"readln;" 这一切都很完美:

repeat
writeln('Make your choise');
read(CH);
readln;

if (CH = '1') then begin
    Writeln('1');
end

until CH = 'q';
Run Code Online (Sandbox Code Playgroud)

我唯一的猜测是,不带参数调用readln会终止读取键盘输入的过程.但如果是这样,为什么读取/读取功能无法自行停止读取输入,以避免这种笨拙?

pascal freepascal

3
推荐指数
1
解决办法
5694
查看次数

拉撒路.对于Unicode符号,等效于Chr()

freepascal中是否有任何函数通过其代码显示Unicode符号(例如U + 1D15E)?不幸的是,Chr()只能使用ANSI符号(代码小于127).
我想使用自定义符号字体中的符号,将它们直接放入源代码非常不方便(它们在Lazarus中显示为?或其他东西,因为它们在系统字体中不存在).

delphi unicode freepascal lazarus

3
推荐指数
2
解决办法
4179
查看次数

在Delphi中使用C ++ .DLL中的函数

我正在尝试从Delphi中的“近似最近邻居”(ANN)库访问各种功能(实际上,它是Lazarus / FreePascal,但这无关紧要)。

这是C ++中的减速度:

#include <cstdlib>                      // C standard lib defs
#include <ANN/ANNx.h>                   // all ANN includes
#include <ANN/ANNperf.h>                // ANN performance 

using namespace std;                    // make std:: accessible
....
....
void annMaxPtsVisit(            // set limit on max. pts to visit in search
    int                 maxPts)         // the limit
{
    ANNmaxPtsVisited = maxPts;
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试annMaxPtsVisit从Lazarus内部访问该函数的方法(如果您不知道Lazarus是什么,请假装其delphi):

unit unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type

  { TForm1 }

  TForm1 = class(TForm) …
Run Code Online (Sandbox Code Playgroud)

c++ dll export freepascal static-linking

3
推荐指数
1
解决办法
3015
查看次数

Turbo Pascal中数组的内存布局

我们在Turbo Pascal中有一个旧的应用程序可以将其内部状态保存到文件中,我们需要能够在C#应用程序中读/写该文件.

旧应用程序通过转储各种内存数据结构来生成文件.在一个地方,应用程序只转储一系列内存,而这个内存范围包含一些数组.我试图找出实际数组元素之前的字节的目的.特别是,块中的前两项可以表示为:

type
  string2 = string[2];
  stringarr2 = array[0..64] of string2;
  string4 = string[4];
  stringarr4 = array[0..64] of string4;
Run Code Online (Sandbox Code Playgroud)

在数据文件中,我看到以下字节序列:

25 00 02 02 41 42 02 43 44 ...
Run Code Online (Sandbox Code Playgroud)

25是数组中元素的数量.这02 41 42是第一个字符串元素"AB"; 这02 43 44是第二个字符串元素,"CD",依此类推.我不知道00 02数组元素计数和第一个数组元素之间的含义是什么.数组元素的数量可能是25 00元素大小02,但每个数组元素的大小实际上是3个字节.

在文件中4字符字符串数组开始的位置,我看到以下内容:

25 00 04 00 00 04 41 42 43 44 04 45 46 47 48
Run Code Online (Sandbox Code Playgroud)

同样,25这是数组中元素的数量; 04 41 42 43 44是数组中的第一个元素,"ABCD",依此类推.在两者之间有字节00 04 00 00 …

delphi freepascal turbo-pascal

3
推荐指数
1
解决办法
846
查看次数

将字符串转换为字节数组将不起作用

我想将String转换为字节数组,代码如下所示:

procedure StringToByteArray(const s : String; var tmp: array of Byte);
var
  i : integer;
begin
       For i:=1 to Length(s) do
       begin
            tmp[i-1] := Ord(s[i]);
       end;

end;
Run Code Online (Sandbox Code Playgroud)

s [i]这里是第i个String元素(= pos i处的char),我将其数值保存到tmp.

这适用于某些角色,但并非适用于所有角色,例如:

Ord('•')返回Dec(149),这是我所期望的.

但在我的程序中,Ord(s [i])返回相同角色的Dec(8226)!

Edit1:我认为缺陷在于我的其他功能"ByteArrayToStr"

转换时......

tmp:= 149    // tmp is of type byte
Log('experiment: ' + Chr(tmp));  // prints "•"
Log('experiment2 ' + IntToStr(Ord(Chr(tmp)))); // prints 149
Run Code Online (Sandbox Code Playgroud)

......来回,这似乎有效.

但是在以下函数中使用相同的转换将不会这样做:

function ByteArrayToStr( a : array of Byte ) : String;
var
  S:String;
  I:integer;
begin
     S:='';
     For I:=0 to …
Run Code Online (Sandbox Code Playgroud)

installer pascal inno-setup freepascal

3
推荐指数
1
解决办法
1530
查看次数

Windows服务中的计时器队列

对于Windows服务,我需要一个计时器来定期执行某项任务.当然,有许多选项似乎优于计时器(多线程,直接从服务的主线程调用方法),但它们在这种特定情况下都有它们的缺点.

但是,由于显而易见的原因,如果没有GUI的消息队列,SetTimer()将无法工作.我所做的(在Free Pascal中)是以下内容:

创建计时器:

MyTimerID := SetTimer(0, 0, 3333, @MyTimerProc);
Run Code Online (Sandbox Code Playgroud)

在服务的主循环中,运行计时器队列:

procedure TMyServiceThread.Execute;
var
  AMessage: TMsg;
begin
  repeat
    // Some calls
    if PeekMessage(AMessage, -1, WM_TIMER, WM_TIMER, PM_REMOVE) then begin
      TranslateMessage(AMessage);
      DispatchMessage(AMessage);
    end;
    // Some more calls
    TerminateEventObject.WaitFor(1000);
  until Terminated;
end;
Run Code Online (Sandbox Code Playgroud)

最后,杀掉计时器:

KillTimer(0, MyTimerID)
Run Code Online (Sandbox Code Playgroud)

除了KillTimer总是返回False,这按预期工作.

我对你的反馈很感兴趣,但是,如果我的实现是正确的 - 我只是想避免弄乱其他应用程序的消息以及我不知道的其他副作用,因为我对消息处理经验不足.

谢谢!

delphi winapi freepascal timer message-queue

3
推荐指数
1
解决办法
1227
查看次数

检查一个数字是否在free pascal范围内

我试图找出将使用Free Pascal case语句的示例传递给简单if语句的正确方法.

使用案例将是

begin usingCaseStatements;

var
  user_age : Integer;

begin

  Writeln('Please enter your age');
  Readln(user_age);

  case user_age of
  1..12 : Writeln('You are too young');
  else
    Writeln('Invalid input');
  end;

  Writeln('Please any key to terminate the program');
  Readln();
end.
Run Code Online (Sandbox Code Playgroud)

-----使用if语句--------

begin usingCaseStatements;

var
  user_age : Integer;

begin

  Writeln('Please enter your age');
  Readln(user_age);

  if user_age in 1..12 then
    Writeln('You are too young')
  else
    Writeln('Invalid input');
  Writeln('Please any key to continue');
  Readln();
end.
Run Code Online (Sandbox Code Playgroud)

我已经尝试在if-statement snipet中替换"in"而没有任何运气在我试过的if (user_age = 1..12) then一点上它只给了我一个错误,编译器声明该语句正在等待')'但它发现..代替.我对FPC非常陌生,所以非常感谢帮助和提示.

delphi pascal freepascal range lazarus

3
推荐指数
1
解决办法
4569
查看次数

Delphi和FPC是否具有MakeWord功能(两个字节或字符)?

这些功能很有用:

function MakeWord(low, high: char): word;
begin
  result := byte(high) shl 8 + byte(low);
end; 

function MakeWord(low, high: byte): word;
begin
  result := high shl 8 + low;
end; 
Run Code Online (Sandbox Code Playgroud)

但是我想知道这些类型的函数(可以以不同方式实现)是否已经存在于某个地方(不是在windows api特定文件中,而是在跨平台RTL函数中).

示例用例:取两个字符GT并从中生成WORD结果.

MakeWord('G','T');
Run Code Online (Sandbox Code Playgroud)

我发现这比在代码中插入SHL/SHR和/或十六进制操作以及其他黑客更容易读取,而这些操作并没有描述代码正在做什么......所以这些函数肯定存在于某个地方?或者人们在他们的应用程序中自行推出?

或类似的东西:

var x: word;
begin
  lo(x) := byte('G');
  hi(x) := byte('T');
end;
Run Code Online (Sandbox Code Playgroud)

但是,这不会起作用,因为左侧不能分配给:但它比其他一些解决方案IMO更具可读性.

我想我也看过LoWord和HiWord函数(或者LoByte,HiByte),但通常只读它们.怎么样写喜欢?

delphi bit-manipulation freepascal bit-shift cpu-word

3
推荐指数
1
解决办法
298
查看次数

隐藏新组件中的属性和事件

我在Lazarus中创建了一个基于TPaintBox的新组件.现在,在Object Inspector中,我拥有属于此基本组件(TPaintBox)的所有属性和事件.

我的问题是:我可以为我的组件隐藏选定的属性和事件吗?

例如,我想只显示Width和Height属性.

你能帮助我吗?

delphi components freepascal lazarus

3
推荐指数
2
解决办法
166
查看次数