見守り電球またはGPS端末が特価中!

C#とDelphiの明確な違いについて教えてください。

現在、Delphiの勉強を行っていますが、知人から、「今後の主流はC#になるからC#を学ぶべきだ」と、アドバイスをいただきました。
確かにインターネットで少し調べると、DelphiよりC#を勧める意見が多く見受けられます。しかし、今までに確認した結論では、「ユーザー数、検索時の情報量の違い」と「64bit未対応」といったものしかなく、特に後者の「64bit未対応」の点では、最新のDelphiだと対応されていることが確認できました。
そのため、「ユーザー数、検索時の情報量の違い」だけでは、C#に変更する必要があるのか疑問を感じています。

そこで、上記の疑問解決のため、「Delphiには無く、C#にはある」といった利点を教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

> >仕事なら選択肢はあんまりないけど


> こちらに関して、これは大規模なアプリを作成するなどの場合、
> Delphiでは支障が生じるということでしょうか?

そうじゃなくて、大規模なアプリケーションを作成する場合、
C# の方が開発者を確保しやすい、ということ。
    • good
    • 0
この回答へのお礼

返信が遅れて申し訳ございませんでした。

〉C# の方が開発者を確保しやすい
なるほど。やはりユーザー数に結論が直結するんですね。

その上で、もし、よろしければなのですが、質問にも記載した「Delphiには無く、C#にはある」といった利点があれば教えてください。

お礼日時:2011/11/07 08:13

別に Delphi を十二分に使いこなせるようになってから、C# も勉強すればいいんじゃない?



仕事なら選択肢はあんまりないけど、趣味でやる分には自由だよ。好き嫌いで決めればいいレベル。
    • good
    • 0
この回答へのお礼

回答していただきありがとうございます。

>仕事なら選択肢はあんまりないけど
こちらに関して、これは大規模なアプリを作成するなどの場合、Delphiでは支障が生じるということでしょうか?
また、ある一定の量になると、やはりC#とDelphiでは差が出てくるのでしょうか?

お礼日時:2011/11/06 21:22

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC#で作成したDLLをDelphiで呼ぶ方法

プログラミング初心者です。
以下の内容について、どなたか教えてください。

Visual studio 2010(C#のフォームアプリケーション)とCOM(ActiveX Tool bar)で作成されたフォームをDelphiで呼び出すことは可能でしょうか。

上記の内容を試験的に作成し(Visual studio 2010C#のフォームにCOMから参照したToolbarを貼り付けた物)、プロジェクトの出力方式をクラスライブラリに変更して、DLLの作成までは行えました。しかし、その先のDelphiからの呼び出し方がわかりません。
上記のDLLを用いてDelphiから呼び出す方法をご存知の方がいれば、教えてください。

なお現在の開発環境は以下の通りです。
Visual Studio 2010(C#)
Delphi XE2(Trial)

ご教授のほど、よろしくお願い致します。

Aベストアンサー

C#ということは、間に.NETが挟まってますよね。

.NET環境で作成されたDLLを、ネイティブな環境から直接呼び出す方法はないと記憶していますが、
過去の質問で似たようなのがありましたので張っておきます。

一応は可能なようです。

参考URL:http://oshiete.goo.ne.jp/qa/6831647.html

QC#の設計者はDelphiを設計した人?

以前、「C#を設計した人はDelphiの設計者なのです」という
文章を見かけたことがあります。
これは本当なのでしょうか?

C#を学んでゆくと、ひとり、個人が設計したと考えた場合、
確かにそうなのかなと思えてきました。

Aベストアンサー

http://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89
http://ja.wikipedia.org/wiki/C_Sharp

アンダース・ヘルスバーグ氏の事ですね。
ボーランド社でTurbo PascalやDelphiを手がけた後にMS社に移籍し、Visual J++やC#を開発したそうです。
両社の間では法廷闘争があったとか。

ただ、もちろん全てを設計した訳ではなく、あくまで開発チームの一員として捉えたほうが良いかと。

参考URL:http://ascii24.com/news/i/topi/article/2002/05/21/635897-000.html

QDelphiでキー入力を投げたい

ゲームコントローラに対応していないソフトウェアを、コントローラに対応させるべくプログラムを組んでいます。
Delphiのプログラムでコントローラからの入力を受け取り、該当するウインドウにメッセージを送信すればこの仕組みが実現できると考えたのです。

まず、以下の関数を記述しました。

function CallBackTest(WH: HWND; LP: LParam): BOOL stdcall;
var
Buff: array [0..255] of Char;
begin
if IsWindowVisible(WH) then
if GetWindowText(WH, Buff, 255) <> 0 then
TListBox(LP).Items.AddObject(Buff, Pointer(WH));
Result := True;
end;

次に、ListBoxを用意して、以下を実行しました。
EnumWindows(@CallBackTest, Longint(ListBox1));
ListBoxには実行中のウインドウタイトルが表示されます。そこで、目的のウインドウ名を選択して

for i := 0 to (ListBox1.Items.Count - 1) do
if ListBox1.Selected[i] then
PostMessage(hwnd(listbox1.Items[i]), WM_KEYDOWN, 入力キー名, 0);
end;

こんな感じで投げられるかな?と思ったのですが、悲しいほど無反応。
なにか根本的にやり方を間違えているのでしょうか・・・?

ゲームコントローラに対応していないソフトウェアを、コントローラに対応させるべくプログラムを組んでいます。
Delphiのプログラムでコントローラからの入力を受け取り、該当するウインドウにメッセージを送信すればこの仕組みが実現できると考えたのです。

まず、以下の関数を記述しました。

function CallBackTest(WH: HWND; LP: LParam): BOOL stdcall;
var
Buff: array [0..255] of Char;
begin
if IsWindowVisible(WH) then
if GetWindowText(WH, Buff, 255) <> 0 then
TListBox...続きを読む

Aベストアンサー

コードを試しました。WindowハンドルをAddObjectで記憶していますので下記は修正しました。

【修正前】PostMessage(hwnd(listbox1.Items[i]), WM_KEYDOWN, 入力キー名, 0);
【修正後】PostMessage(hwnd(listbox1.Items.Objects[i]), WM_KEYDOWN, {入力キー名} 48, 0);

この修正を加えたら、秀丸エディタには文字0を入力できました。しかし、メモ帳やワードパッドには入力できませんでした。

ウィンドウとメッセージについて調べて試す必要があると思います。EnumWindowsはトップレベルのウィンドウしか探しません。目的のアプリケーションがトップレベルのウィンドウにWM_KEYDOWNを送って反応するものかどうか。子ウィンドウあるいは別のメッセージにしたらどうか、フォーカスをあてたらどうか、など。

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

QDelphi6でVB.NETで作成のDLL呼出

VisualSutudio2005で作成され提供されているDLLをDelphi6から呼びだしたいと思っています。
提供ファイルとしてあるのは以下のものです。
・DLLファイル本体
・XMLファイル

直接は呼びだせない(?)と思ったので、
VB.NETでDLLを作って間に入れて、
下のように呼び出せばいいのかなと考えています。

Delphi6で作成のEXE → VB.NETで作成のDLL(COM登録?) → 対象のDLL

まずはDelphi6のEXE→VB.NETのDLLの部分を作って試してみたですが
Delphi6のEXEの起動時にエラーとなってしまいます。
「アプリケーションの初期化に失敗しました」
ネットなどで調べてみて作り方は下記のようにしました。

<呼ばれる側:VB.NETのDLL>
1.COMクラスを作る。
  ・COM参照可能の設定にした。
(タイプライブラリが作成され、レジストリへのCOM登録は自動でされる?)
2.作成したDLLはCドライブ直下に置いた。

※下の*****は自動作成された固定値が入っています。
 また見やすくするためここでは半角空白を全角空白に変えています。
--------------------------------------------------------------------
Imports System.Windows.Forms
<ComClass(Middle_Dll.ClassId, Middle_Dll.InterfaceId, Middle_Dll.EventsId)> _
Public Class Middle_Dll

#Region "COM GUID"
  ' これらの GUID は、このクラスおよびその COM インターフェイスの COM ID を
  ' 指定します。この値を変更すると、
  ' 既存のクライアントはクラスにアクセスできなくなります。
  Public Const ClassId As String   = "**************************"
  Public Const InterfaceId As String = "**************************"
  Public Const EventsId As String  = "**************************"
#End Region

  ' 作成可能な COM クラスにはパラメータなしの Public Sub New() を指定しなければ
  ' なりません。これを行わないと、クラスは COM レジストリに登録されず、
  ' CreateObject 経由で
  ' 作成できません。
  Public Sub New()
    MyBase.New()
  End Sub

  Public Sub DispMsg()
    Dim MsgRet As MsgBoxResult
    MsgRet = MessageBox.Show("VB.NET DLLより表示!", "確認メッセージ", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
  End Sub

End Class
---------------------------------------------------------------------

<呼び出し側:Delphi6のEXE>
1.タイプライブラリの取り込み設定で登録したDLLを選択し、
  「コンポーネントラッパーの作成」にチェックを入れてインストールを実行。
---------------------------------------------------------------------
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls,OleCtnrs,ComObj, OleServer;

type
 TForm1 = class(TForm)
  Button1: TButton;
  Edit1: TEdit;
  procedure Button1Click(Sender: TObject);
 private
  { Private 宣言 }
 public
  { Public 宣言 }
 end;

var
 Form1: TForm1;
 //----------
 //静的呼出
 //----------
 procedure DispMsg();Stdcall; external 'c:\Middle_Dll.dll' name 'DispMsg';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 //----------
 //静的呼出
 //----------
 DispMsg();
end;
end.
-----------------------------------------------------------------

Delphi6のEXEはすでにあるものなので、
呼び出し元はDelphi6から変えられませんが、
呼び出し先はC#やC++でも構いません。
(1)Delphi6のEXE→VB.NETのDLLの呼び出しは可能でしょうか?
(2)可能でしたら不具合と思われる箇所はどこでしょうか?
(3)この方法より良いと思われる方法はありますでしょうか?

DLLを作った事がないので見よう見まねで作っています。
気になる点やアドバイス程度でも構いませんので、
どうかよろしくお願いいたします。

== 開発環境 ==
WindowsXP SP3
Delphi6 Enterprise SP2
VisualSutudio2005 ProffesionalEdition 評価版
.NET Framework 1.1~3.5

VisualSutudio2005で作成され提供されているDLLをDelphi6から呼びだしたいと思っています。
提供ファイルとしてあるのは以下のものです。
・DLLファイル本体
・XMLファイル

直接は呼びだせない(?)と思ったので、
VB.NETでDLLを作って間に入れて、
下のように呼び出せばいいのかなと考えています。

Delphi6で作成のEXE → VB.NETで作成のDLL(COM登録?) → 対象のDLL

まずはDelphi6のEXE→VB.NETのDLLの部分を作って試してみたですが
Delphi6のEXEの起動時にエラーとなってしまいます。
「アプリケーションの...続きを読む

Aベストアンサー

ここが参考になると思います。

Using a .NET Assembly via COM by Jim McKeeth
http://dn.embarcadero.com/article/32754

Q開発ツールDelphiが廃れた理由を教えて下さい。

以前Delphiと言う開発ツールを使ったことがあるのですが、その頃は、とても人気がありました。しかし、最近はWebで、Delphiに関するサイトが見つかりません。どうも人気がないようですが、なぜなんでしょう?教えて下さい。

Aベストアンサー

開発ツールがマイクロソフトに押されているのは確かで
初めて触る人が非常に少なくなってきているのは確かです

が、依然使用している企業は少なくないですよ。
またWebで見つからない原因は
探し方が足りないのもありそうですが
技術レベルが均等に居ないからではないでしょうか?

つまり、初心者ならWeb上に上げることが多いのですが
上級者になるにつれて、わざわざ公開しなくなるので・・・


なんにしろ、企業では現役のツールですよ

QDelphiの利点・欠点、それを取り巻く状況。

 日曜プログラマーを目指しているのですが、Delphiにしようか、VB系にしようか迷っています。
あまり外部ランタイムを使いたくない(できるだけ多くの人が、簡単に使える事が理想)ので、Delphiに傾いているのですが、書籍が少ない事や、今まで触ってきたプログラムと少し違う事に少しとまどいも感じています。

 Delphiをいじっている人は、どんな利点があり、欠点がありますか?
また、そのほかで実感している事がありましたら、経験者としての立場から、はじめの一歩を踏み出せる勇気をください。

 私が触ってきた言語としては、Perl、PHP、JAVA(の概念だけ)。

Aベストアンサー

VB系の場合ですが
VB.netでは.net Frameworkに依存するexeしか作成出来ません。
(前の質問でそれは望んでいないという事だったと思うので)
そうなるとVB6になりますが、外部のdll(VB6ランタイム)に依存することになり
あまりスマートではありません。
(ただしWin2k以降全てではないですがVB6のランタイムが標準で入っています。)
それにVB6単体での販売は終了していると思います。

外部依存しない単体の実行ファイル(exe)を作る一般的な選択肢としては
DelphiかC/C++(VC++、BCC)でしょう。

Q言語の実行スピードで早い順に並べてみたら

VisualStudio2005とVisualStudio6を持っていますが、同じアルゴリズムで書かれたプログラムで実行速度が速い順を知りたいのですが

私の主観ですが(抜けているものがありましたら追加してください。)
以下のような予想になります。

VC2005++
VC6++
Delphi
BCC
C#
VC.NET 2005
VB.NET 2005
Visual J++
VisualBasic6

皆さんの意見が知りたいです。(Lispやその他の言語もご存知な場合もよろしく。)

また、アセンブラ(マシン語)の埋め込みができる言語も知りたいです。昔、下のような記述ができた言語があったような記憶がありますが
今でもどの開発ツール(ボーランド社など他のメーカーも含めて)で可能なのでしょうか?

asm{
mov ax, 4000h;
int 0x21;
}

Aベストアンサー

> 条件は、バブルソートにかかる時間がどの処理系が早いかです。

提示されたソースであれば、Visual C++(ネイティブコードであれば、バージョンはあまり関係ないと思います)が一番高速になりそうです。
同じC/C++でも、最適化性能の関係でBorland C++ Compilerは遅くなります。また、Borland C++ Compilerの場合、C++はCより遅くなる傾向にあります。なお、.NETやJavaはどうしても不利になりますね。

QC#「オブジェクト参照が必要です」(初心者)

Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。
Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。
ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の
Form1.pictureBox1.image = Image.FromFile("motion1.png");
”Form1.pictureBox1”に当てられています。

何が原因と考えられるでしょうか。
もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。
よろしくお願いします。

Aベストアンサー

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具体的な解決方法としては、PictureBoxに初期画像を設定する処理をForm1のコンストラクタでやるのがいいと思います。
その際、redfox63さんがおっしゃられるように
this.pictureBox1
と記述することが必要です。(thisは自分自身のインスタンスを指します)

後は、Windowsフォームで一定間隔での処理をするための「Timerコンポーネント」について調べてみたらいいと思います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html

MSDNライブラリ Timerクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具...続きを読む

QC#で共有変数の定義をするには

C#で共有変数の定義をするには、どうしたらよいでしょうか。具体的には、起動パラメータで、任意の文字列(3~4バイト)を渡して、C#アプリケーションを、起動し、プログラムの任意の場所で、そのパラメータを参照したいと考えています。起動パラメータの受け取りは、できるのですが、そのパラメータを、プログラムのどこからも参照できる領域(ここの定義方法が不明)に格納するには、どうしたらよいでしょうか。(2重起動を許す前提です。実行時に1つの目のプログラムにはパラメータ"XYZ"を渡し、2つ目のプログラムを起動時にはパラメータ"ABCD"を渡し、その値により、プログラムの動作を制御したいと思っています)
Windows-xp visual-studio2008 C#でwindowsアプリケーションを作成しています。

Aベストアンサー

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
    // ここに記述
    static public string strArg = null;
  }
}

メインクラスのメンバーとしてスコープが有効な場所に記述します

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(n...続きを読む


人気Q&Aランキング